java - 重用 ThreadPoolExecutor 与创建和处置 Ad Hoc?

标签 java multithreading concurrency threadpoolexecutor

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

我不想使用闩锁或任何类型的同步器,因为我不想影响吞吐量。我怀疑闩锁的内部结构会因同步计数器而减慢速度。我也不想使用带有 invokeAll() 的 future 列表,因为我想在遍历它们时立即开始执行可运行对象。

但是,为每个阶段创建一个 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();

}

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

最佳答案

如果你销毁线程池并重新启动一个新线程池,它可能比使用 CountDownLatch 花费更多!

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

Donald Knuth 曾经说过:

premature optimization is the root of all evil.

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

关于java - 重用 ThreadPoolExecutor 与创建和处置 Ad Hoc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277537/

相关文章:

java - 关于根据条件启动线程

c++ - Windows C++ 进程与线程

java - 如何在并发客户端之间广播消息?

c++ - 多线程建议

python - 使用 call_soon() 和 ensure_future() 的区别

java - 为什么Java中的BlockingQueue在notify上没有if子句?

java - 在 OSGi 环境中使用 OPCPackage 从类路径加载文件

java - 如何使 Android CheckBoxPreference 不可点击?

java - 如何以编程方式打开新的浏览器窗口

JavaFX:如果另一个对象处于 Activity 状态,则用于禁用按钮的 FXML 脚本