我有很多任务:
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 语义结合起来。我的意思是按需创建线程,如果不使用则释放它们。
也许有更好的方法?你能提出一些建议吗?
最佳答案
I mean creating threads on demand and release them if not used.
这就是缓存线程池的运行方式。它从 0 个线程开始,每次有新任务要处理并且池中的所有线程都忙时创建一个新线程。如果线程空闲 60 秒,则该线程将被终止。 默认缓存线程池是使用以下 ThreadPoolExecutor 构造函数创建的:
return new ThreadPoolExecutor(0,
Integer.MAX_VALUE,
60L,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>())
它在池中创建了 0 个可能的空闲线程,最大线程数不受限制,空闲线程终止前有 60 秒超时,并且队列实现不存储任务,仅在池及其线程之间传输任务。这样的池适合许多可能属于您的情况的短期任务。正如您所看到的,使用直接的 ThreadPoolExecutor 构造函数根据您的需要调整配置也非常容易。
关于java - Java Util并发池选择哪个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46052757/