package thread;import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;class TaskPortion implements Runnable{
private static int count=0;
private final int id=count++;
private Random r=new Random(10);
private final CountDownLatch latch;
public TaskPortion(CountDownLatch latch) {
// TODO Auto-generated constructor stub
this.latch=latch;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
doWork();
latch.countDown();
}catch(InterruptedException ie){
System.out.println(this+" interrupted.");
}
}
public void doWork() throws InterruptedException{
Thread.sleep(r.nextInt(2000));
System.out.println(this+"completed.");
}
@Override
public String toString() {
// TODO Auto-generated method stub
// return "Task "+id;
return String.format("%1$-3d", id);
}
}class WaitingTask implements Runnable{
private static int count=0;
private final int id=count++;
private final CountDownLatch latch;
public WaitingTask(CountDownLatch latch) {
// TODO Auto-generated constructor stub
this.latch=latch;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
latch.await();
System.out.println(this+" completed.");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(this+" interrupted.");
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "WaitingTask "+id;
}
}public class CountDownLatchDemo {
static final int SIZE=100; /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService service=Executors.newCachedThreadPool();
CountDownLatch latch=new CountDownLatch(SIZE);
for(int i=0;i<10;i++)
service.submit(new WaitingTask(latch));
for(int i=0;i<SIZE;i++)
service.submit(new TaskPortion(latch));
System.out.println("launch all task.");
// service.shutdown();
}}这段代码来自<<Thinking in java>>,不解为什么最后一行如果加上注释,程序执行完了,为什么主程序还是没有结束?实际上所有线程都执行完了
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货