0

我想使用选项 2 中的线程池来替换选项 1 中的代码。我该如何实现?1
1. 使用加入

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"); 

// 从这里'主'线程继续

这和第一个完全一样吗?还是我的代码正确?谢谢你。

4

2 回答 2

2

不。功能上的唯一区别是,在选项 2 中,您只有一个线程正在执行。您仍然必须向其中添加每个工作Fixed size线程,这只是可以同时运行的最大线程数(如果添加第三个线程,它将等到较早添加的线程之一完成后再运行它)。

此外,不推荐忙等待(带有条件的 while 循环!executor.isTerminated())和不好的做法。相反,我建议使用executor.awaitTermination(long timeout, TimeUnit unit)或至少Thread.sleep()在循环中使用 a 。

于 2013-04-12T00:19:57.593 回答
0

在您的第一个示例中,您将运行 2 个线程,但在第二个示例中,即使您有一个包含 2 个线程的线程池,您也只提供了 1 个可运行的运行。所以不会使用池中的第二个线程。

您还可以在关机后使用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"); 
于 2013-04-12T00:33:50.110 回答