java - Java Util并发池选择哪个

标签 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 语义结合起来。我的意思是按需创建线程,如果不使用则释放它们。

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

最佳答案

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/

相关文章:

java - 基本三角学(画线)

Javamail 多线程多收信

java - 理解java中的同步

c# - 不支持 STA 线程上多个句柄的 WaitAll

Java 数组 - 为什么输出 '1' ?

java - 在主线程上解析 XML,但通过 AsyncTask 下载 - "Invalid stream or encoding: android.os.NetworkOnMainThreadException"

c# - 生产者消费者模式如何通知完成?

java - 如何等待 2 分钟让方法完成,然后退出并继续?

.net - 的确,对于长时间运行的进程,最好手动执行线程而不是线程池?

java - 在 Struts 2 中隐藏 struts.xml 值的参数