相关疑难解决方法(0)

如何让ThreadPoolExecutor在排队之前将线程增加到最大值?

我已经沮丧了一段时间,其默认行为ThreadPoolExecutor支持ExecutorService我们这么多人使用的线程池.引用Javadocs:

如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程.

这意味着如果您使用以下代码定义线程池,它将永远不会启动第二个线程,因为它LinkedBlockingQueue是无限制的.

ExecutorService threadPool =
   new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/,
      TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */));
Run Code Online (Sandbox Code Playgroud)

只有当您有一个有界队列并且队列已满时才会启动核心编号之上的任何线程.我怀疑大量的初级Java多线程程序员并不知道这种行为ThreadPoolExecutor.

现在我有一个特定的用例,这不是最佳的.我正在寻找方法,而不是编写我自己的TPE课程来解决它.

我的要求是针对可能不可靠的第三方回拨的Web服务.

  • 我不想与web-request同步回调,所以我想使用一个线程池.
  • 我通常会得到一些这样的一分钟,所以我不希望有newFixedThreadPool(...)大量的线程,大多数都处于休眠状态.
  • 我经常会遇到这种流量的爆发,我想将线程数量扩大到某个最大值(比方说50).
  • 我需要尽最大努力做所有回调,所以我想排队50以上的任何额外的回调.我不想通过使用a来压倒我的网络服务器的其余部分newCachedThreadPool().

更多线程启动之前,如何解决ThreadPoolExecutor队列需要限制和填充的限制?如何让它排队任务之前启动更多线程?

编辑:

@Flavio提出了使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)核心线程超时并退出的好处.我考虑过这一点,但我仍然想要核心线程功能.如果可能的话,我不希望池中的线程数降到核心大小以下.

java multithreading blockingqueue threadpoolexecutor

90
推荐指数
5
解决办法
2万
查看次数

Java ThreadPoolExecutor策略,带队列的'直接切换'?

我希望有一个ThreadPoolExecutor我可以设置a corePoolSize和a的地方maximumPoolSize,会发生什么是队列会立即将任务交给线程池,从而创建新线程,直到它到达maximumPoolSize然后开始添加到队列.

有这样的事吗?如果没有,有没有什么好的理由没有这样的策略?

我真正想要的是将任务提交执行,当它达到一个点,在这一点上,由于拥有太多线程(通过设置maximumPoolSize),它实际上将获得"最差"的性能,它将停止添加新线程并使用它线程池并开始排队,然后如果队列已满,则拒绝.

当负载恢复时,它可以开始拆除未使用的线程返回corePoolSize.

这在我的应用程序中比在http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html中列出的"三个一般策略"更有意义.

java threadpool

6
推荐指数
1
解决办法
2180
查看次数

具有corePoolSize 0的ThreadPoolExecutor在任务队列已满之前不应执行任务

我正在经历Java Concurrency In Practice并且陷入8.3.1线程创建和拆解主题.以下脚注警告要保持corePoolSize零.

开发人员有时会试图将核心大小设置为零,这样工作线程最终会被拆除,因此不会阻止JVM退出,但这可能会导致在不使用a的线程池中出现一些看似奇怪的行为.用于工作队列的SynchronousQueue(如newCachedThreadPool所做的那样).如果池已经是核心大小,则ThreadPoolExecutor仅在工作队列已满时才创建新线程.因此,在队列填满之前,提交给具有任何容量和核心大小为零的工作队列的线程池的任务将不会执行,这通常不是所希望的.

所以为了验证这一点,我写了这个程序,它不能像上面说的那样工作.

    final int corePoolSize = 0;
    ThreadPoolExecutor tp = new ThreadPoolExecutor(corePoolSize, 1, 5, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>());

    // If the pool is already at the core size
    if (tp.getPoolSize() == corePoolSize) {
        ExecutorService ex = tp;

        // So tasks submitted to a thread pool with a work queue that has any capacity
        // and a core size of zero will not execute until the queue fills …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading threadpool java-threads

6
推荐指数
1
解决办法
1169
查看次数

动态线程池

我有一个长时间运行的过程,它监听事件并进行一些密集的处理.

目前我Executors.newFixedThreadPool(x)用来限制同时运行的作业数量,但是根据一天中的时间和其他各种因素,我希望能够动态增加或减少并发线程的数量.

如果我减少并发线程的数量,我希望当前正在运行的作业能够很好地完成.

是否有一个Java库可以让我控制并动态增加或减少线程池中运行的并发线程数?(该类必须实现ExecutorService).

我必须自己实施吗?

java multithreading executorservice threadpool threadpoolexecutor

4
推荐指数
1
解决办法
4513
查看次数

在Spring中实现线程功能的最佳方法

我正在使用Spring 3.2进行Java聊天项目.

通常在Java中我可以创建一个这样的线程:

public class Listener extends Thread{
    public void run(){
         while(true){

         }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后启动线程start().

但是Spring 3.x有没有特殊的类或任何特殊的方法来实现线程功能?


我的要求:

我有2个电信域服务器.在我的应用程序中,我需要初始化服务器以创建协议.

初始化服务器后,我需要启动两个线程来监听来自电信域服务器的响应.

我所做的工作如下:

public class Listener extends Thread{
    public void run(){

       while(true){
           if(ServerOne.protocol != null){
                Message events = ServerOne.protocol.receive();
                   //Others steps to display the message in the view
           }
       }

    }
}
Run Code Online (Sandbox Code Playgroud)


有可能用java做线程功能quartz吗?

如果可能哪一个更好?如果没有意思,是什么原因?

希望我们的堆栈成员能提供更好的解决方案.

java spring multithreading spring-mvc quartz-scheduler

1
推荐指数
1
解决办法
5930
查看次数