【发布时间】:2014-10-06 07:17:27
【问题描述】:
我正在构建一个具有几个阶段的多线程进程,每个阶段迭代未知数量的对象(来自缓冲查询结果集或文本文件的数十万个对象)。每个阶段将为每个对象启动一个可运行或可调用对象,但所有可运行/可调用对象必须完成才能进入下一个阶段。
我不想使用锁存器或任何类型的同步器,因为我不想损害吞吐量。我怀疑闩锁的内部结构会通过同步计数器减慢速度。我也不想使用带有 invokeAll() 的期货列表,因为我想在迭代它们时立即开始执行可运行对象。
但是,为每个阶段创建一个 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();
}
但是,我知道设置线程、线程池以及任何涉及并发的东西的构建和销毁都是昂贵的。或者也许这没什么大不了的,我只是对性能过于谨慎,因为无论如何并发都会产生昂贵的开销。有没有更有效的方法来做到这一点?使用某种我不知道的等待完成操作?
【问题讨论】:
标签: java multithreading concurrency threadpoolexecutor