我有很多任务:
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
}
}
ProcessSeconds
,ProcessMonth
,...等
等等。在这里使用ForkJoinPool
会很方便,但从性能角度来看并不好,因为ProcessXXX
任务被提交到一组机器,因此方法调用本身很短。
因此,对于性能而言,使用Executors.cachedThreadPoolExecutor
是件好事。但是有没有办法将ForkJoinPool与chachedThreadPool语义结合起来。我的意思是按需创建线程,如果不使用则释放它们。
也许有更好的方法吗?你能提出一些建议吗?
答案 0 :(得分:1)
我的意思是按需创建线程,如果不使用则释放它们。
这就是缓存线程池的运行方式。它从0个线程开始,每当有新任务要处理并且池中的所有线程都忙时,它就会创建一个新线程。如果线程空闲60秒,则终止线程。
使用以下ThreadPoolExecutor
构造函数创建默认缓存线程池:
return new ThreadPoolExecutor(0,
Integer.MAX_VALUE,
60L,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>())
它创建了池中0个可能的空闲线程,无限的最大线程数,空闲线程终止前60秒超时,以及不存储任务的队列实现,只是在池及其线程之间传输它们。这样的池适用于许多短期任务,可能是你的情况。正如您所看到的,使用直接ThreadPoolExecutor
构造函数根据您的需要调整配置也非常容易。