我想在选项2中使用线程池来替换选项1中的代码。我该如何实现?
1
1.使用Join
Thread e1 = new Thread(new EventThread("e1"));
e1.start();
Thread e2 = new Thread(new EventThread("e2"));
e2.start();
e1.join();
e2.join();
// from here 'main' thread continue
2.使用线程池 现在我想使用ExecutorService类
执行相同的工作public class EventThread implements Runnable{
public EventThread(String message){
}
}
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable worker = new EventThread("");
executor.execute(worker);
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println("Finished all threads");
//从这里'主'线程继续
这与第一个完全相同吗?或者我的代码是对的? 谢谢。
答案 0 :(得分:2)
没有。功能上唯一的区别是在选项2中只有一个线程在执行。您仍然需要向其添加每个工作程序,Fixed size
只是可以并发运行的最大线程数量(如果添加第三个线程,它将等待一个先前添加的线程完成后再运行它) 。
此外,不推荐繁忙的等待(具有条件!executor.isTerminated()
的while循环),这是不好的做法。相反,我建议使用executor.awaitTermination(long timeout, TimeUnit unit)
或至少在循环中使用Thread.sleep()
。
答案 1 :(得分:0)
在您的第一个示例中,您将运行2个线程,但在第二个示例中,即使您拥有2个线程的线程池,您也只能运行1个runnable。所以不会使用池中的第二个线程。
您也可以在关机后使用awaitTermination()而不是while循环:
ExecutorService executor = Executors.newFixedThreadPool(2);
for(i=0;i<2;i++){
executor.execute(new EventThread("e"+i));
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
...
}
System.out.println("Finished all threads");