我正在使用 ExecutorService
学习如何在 Java 中使用线程池,这是我正在处理的示例:
public class Example {
static class WorkerThread implements Runnable {
private String command;
public WorkerThread(String s) {
this.command = s;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " Start. Command = " + command);
processCommand();
System.out.println(Thread.currentThread().getName() + " End.");
}
private void processCommand() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return this.command;
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
executor.awaitTermination(1, TimeUnit.SECONDS);
// while (!executor.isTerminated()) {
// }
System.out.println("Finished all threads");
}
}
我有两个问题:
我应该如何等待
ExecutorService
的终止? , 我应该使用awaitTermination()
或isTerminated()
(有人提出后者是错误的做法)?是
Runnable
s 已正确添加到执行程序中,或者我应该使用submit()
连同Future<T>
回调?
这可能取决于上下文,所以请您解释(对于这两个问题)我应该在什么时候使用提到的每个解决方案。
最佳答案
实现它的几种方法:
(a) 在 while (!executor.isTerminated())
内调用 awaitTermination(long someTime, TimeUnit ....)
。
(b) 将所有可调用对象存储在 Collection 对象中并调用 executor.invokeAll(....)
。这将等到执行程序服务完成所有任务。
关于java - 提交并等待 ExecutorService 终止的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324022/