重用 ThreadPoolExecutor 还是创建和处理 Ad Hoc?

tmn*_*tmn 5 java concurrency multithreading threadpoolexecutor

我正在构建一个多线程进程,它有几个阶段,每个阶段遍历未知数量的对象(来自缓冲查询结果集或文本文件的数十万个)。每个阶段将为每个对象启动一个可运行或可调用对象,但所有可运行对象/可调用对象必须完成才能进入下一个阶段。

我不想使用锁存器或任何类型的同步器,因为我不想损害吞吐量。我怀疑锁存器的内部结构会通过同步计数器减慢速度。我也不想在 invokeAll() 中使用期货列表,因为我想在迭代它们时立即开始执行 runnable。

但是,为每个阶段创建一个 ThreadPoolExecutor,循环并提交所有可运行对象,然后为每个阶段关闭它似乎是一个功能解决方案......

public void runProcess() {

ResultSet rs = someDbConnection.executeQuery(someSQL);

ExecutorService stage1Executor = Executors.newFixedThreadPool(9);
while (rs.next()) { 
//SUBMIT UNKNOWN # OF RUNNABLES FOR STAGE 1
}
rs.close();
stage1Executor.shutdown(); 

rs = someDbConnection.executeQuery(moreSQL);

ExecutorService stage2Executor = Executors.newFixedThreadPool(9);
while (rs.next()) {  
//SUBMIT UNKNOWN # OF RUNNABLES FOR STAGE 2
}
rs.close();
stage2Executor.shutdown();

}
Run Code Online (Sandbox Code Playgroud)

但是,我知道设置线程、线程池和任何涉及并发的东西的构建和销毁成本都很高。或者也许这没什么大不了的,我只是对性能过于谨慎,因为无论如何并发都有昂贵的开销。有没有更有效的方法来做到这一点?使用某种我不知道的等待完成操作?

alf*_*sin 5

如果您销毁线程池并重新初始化一个新的线程池,则可能比使用 CountDownLatch 花费更多!

此外,调用stage1Executor.shutdown();并不保证所有当前线程都将在新的 ExecutorService 启动并运行之前完成它们的执行。即使打电话shutdownNow()也不能保证!(并且您可能不想调用,shutdownNow()因为您希望线程完成执行)。

唐纳德·克努斯 (Donald Knuth) 曾经说过:

过早优化是万恶之源。

所以即使你没有被我说服 - 最好听他说:)