executor:等待特定任务完成

ppcbkaq5  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(298)

我正在运行的服务器应用程序获取多个任务请求,这些任务是我要使用任务系统处理的。
每个任务都表示为 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 或者任何类似的线程池。

ef1yzkbh

ef1yzkbh1#

如果我理解正确,您将需要这样的东西(但您的体系结构似乎太复杂):

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秒)。

kmpatx3s

kmpatx3s2#

你可以用 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);

相关问题