从Java Util并发中选择哪个池

时间:2017-09-05 10:27:44

标签: java multithreading threadpool

我有很多任务:

public class ProcessDay implements Runnable{
    @Override
    public void run(){
        List<ProcessHour> hr = //required hours
        //do some post actions
    }
}

public class ProcessHour implements Runnable{
    @Override
    public void run(){
        List<ProcessMinutes> mins = //required minutes
        //do some post actions
    }
}

ProcessSecondsProcessMonth,...等 等等。在这里使用ForkJoinPool会很方便,但从性能角度来看并不好,因为ProcessXXX任务被提交到一组机器,因此方法调用本身很短。

因此,对于性能而言,使用Executors.cachedThreadPoolExecutor是件好事。但是有没有办法将ForkJoinPool与chachedThreadPool语义结合起来。我的意思是按需创建线程,如果不使用则释放它们。

也许有更好的方法吗?你能提出一些建议吗?

1 个答案:

答案 0 :(得分:1)

  

我的意思是按需创建线程,如果不使用则释放它们。

这就是缓存线程池的运行方式。它从0个线程开始,每当有新任务要处理并且池中的所有线程都忙时,它就会创建一个新线程。如果线程空闲60秒,则终止线程。 使用以下ThreadPoolExecutor构造函数创建默认缓存线程池:

return new ThreadPoolExecutor(0,
                              Integer.MAX_VALUE,
                              60L,
                              TimeUnit.SECONDS,
                              new SynchronousQueue<Runnable>())

它创建了池中0个可能的空闲线程,无限的最大线程数,空闲线程终止前60秒超时,以及不存储任务的队列实现,只是在池及其线程之间传输它们。这样的池适用于许多短期任务,可能是你的情况。正如您所看到的,使用直接ThreadPoolExecutor构造函数根据您的需要调整配置也非常容易。

相关问题