我正在寻找一种在 java 中执行批量任务的方法。这个想法是有一个ExecutorService
基于线程池的线程池,它允许我在一个线程Callable
的不同线程之间传播一组main
。此类应提供一个waitForCompletion方法,该方法将使main
线程进入睡眠状态,直到所有任务都执行完毕。然后main
线程应该被唤醒,它会执行一些操作并重新提交一组任务。
这个过程会重复很多次,所以我想使用ExecutorService.shutdown
它,因为这需要创建多个ExecutorService
.
AtomicInteger
目前我已经使用 a和 a Lock
/以下列方式实现了它Condition
:
public class BatchThreadPoolExecutor extends ThreadPoolExecutor {
private final AtomicInteger mActiveCount;
private final Lock mLock;
private final Condition mCondition;
public <C extends Callable<V>, V> Map<C, Future<V>> submitBatch(Collection<C> batch){
...
for(C task : batch){
submit(task);
mActiveCount.incrementAndGet();
}
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
mLock.lock();
if (mActiveCount.decrementAndGet() == 0) {
mCondition.signalAll();
}
mLock.unlock();
}
public void awaitBatchCompletion() throws InterruptedException {
...
// Lock and wait until there is no active task
mLock.lock();
while (mActiveCount.get() > 0) {
try {
mCondition.await();
} catch (InterruptedException e) {
mLock.unlock();
throw e;
}
}
mLock.unlock();
}
}
请注意,我不一定会一次提交批次中的所有任务,因此CountDownLatch
似乎不是一个选择。
这是一种有效的方法吗?有没有更有效/优雅的方式来实现它?
谢谢