执行者:等待特定任务完成

时间:2015-01-15 10:02:16

标签: java multithreading

我正在运行的服务器应用程序获得了多个我想要使用任务系统处理的任务请求。

每个任务都表示为Runnable,它将从线程池中请求n个线程数,其中n小于或等于线程池大小。当然,线程池是必要的,以便使用太多线程重载CPU。

但是,其中一些任务可能是多线程的,有些则不能。这就是为什么一个任务可能需要等待所有特定线程完成以便合并来自这些线程的结果以获得最终结果。

如果使用多个Thread实例,可以加入以下内容:

try {
    // Wait for all threads to finish their tasks
    for (Thread thread : threads) {
        thread.join();
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

// Finish job here ..

但我需要使用java.util.concurrent.Executor或类似于线程池的类似内容。

2 个答案:

答案 0 :(得分:2)

您可以为每项任务使用ExecutorServiceCyclicBarrier,如下所示:

public class ThreadedTask implements Runnable {
    CyclicBarrier barrier;
    public ThreadedTask(CyclicBarrier barrier) {
        this.barrier = barrier;
    }
    @Override
    public void run() {
        // do something
        barrier.await();
    }
}
ExecutorService executor = Executors.newFixedThreadPool(pool_size);
...
CyclicBarrier barrier = new CyclicBarrier(n+1);
for(int i=0; i<n; i++) {
    // launch all tasks
    executor.submit(new ThreadedTask(barrier));
}
// waits for the tasks to finish or timeout
barrier.await(seconds, TimeUnit.SECONDS);

答案 1 :(得分:1)

如果我理解正确,你需要这样的东西(但你的架构似乎太复杂了):

class MyTask implements Runnable {
    @Override
    public void run() {
        // some work
    }
}

之后:

ExecutorService executorService = Executors.newFixedThreadPool(2000);
ArrayList<Future> futures = new ArrayList<>();

futures.add(executorService.submit(new MyTask()));
futures.add(executorService.submit(new MyTask()));
futures.add(executorService.submit(new MyTask()));

for (Future future: futures) {
    try {
        future.get(100, TimeUnit.SECONDS); 
    } catch (Throwable cause) {
        // process cause
    }
}

每个future.get()将等待任务结束(在此示例中最多100秒)。