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>>,不解为什么最后一行如果加上注释,程序执行完了,为什么主程序还是没有结束?实际上所有线程都执行完了