【发布时间】:2016-02-10 19:17:56
【问题描述】:
我正在学习如何使用 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()(有人建议后者是错误的做法)? Runnables 是否正确添加到执行程序中,还是应该将submit()与Future<T>回调一起使用?
这可能取决于上下文,所以请您解释一下(对于这两个问题)我应该什么时候使用提到的每个解决方案。
【问题讨论】:
-
您可以同时使用
awaitTermination()等待(它可以抛出一个InterruptedException),然后在catch 块中使用isTerminated()来检查是否成功终止。当您想知道单个任务是否已被处理时,使用 Future回调。
标签: java multithreading threadpool executorservice