Javaでタスクのバッチを実行する方法を探しています。アイデアはExecutorService
、スレッドプールに基づいて、スレッドCallable
のさまざまなスレッド間で一連のセットを分散できるようにすることですmain
。このクラスは、すべてのタスクが実行されるまでスレッドをスリープ状態にするwaitForCompletionメソッドを提供する必要があります。main
次に、main
スレッドを起動する必要があります。スレッドはいくつかの操作を実行し、一連のタスクを再送信します。
このプロセスは何度も繰り返されるので、ExecutorService.shutdown
の複数のインスタンスを作成する必要があるので、使用したいと思いますExecutorService
。
AtomicInteger
現在、、、および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
、オプションではないようです。
これはそれを行うための有効な方法ですか?それを実装するためのより効率的でエレガントな方法はありますか?
ありがとう