我正在运行的服务器应用程序获得了多个我想要使用任务系统处理的任务请求。
每个任务都表示为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
或类似于线程池的类似内容。
答案 0 :(得分:2)
您可以为每项任务使用ExecutorService
和CyclicBarrier
,如下所示:
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秒)。