Java主线程等待子线程、线程池 (四)

2014-11-24 10:24:25 · 作者: · 浏览: 4
g start = System.currentTimeMillis();

// 创建一个同时允许两个线程并发执行的线程池
ExecutorService executor = Executors.newFixedThreadPool(2);
for(int i = 0; i < 5; i++)
{
Thread thread = new TestThread();
executor.execute(thread);
}
executor.shutdown();

try
{
// awaitTermination返回false即超时会继续循环,返回true即线程池中的线程执行完成主线程跳出循环往下执行,每隔10秒循环一次
while (!executor.awaitTermination(10, TimeUnit.SECONDS));
}
catch (InterruptedException e)
{
e.printStackTrace();
}

long end = System.currentTimeMillis();
System.out.println("子线程执行时长:" + (end - start));
}
}


执行结果:

Thread-0子线程开始

Thread-1子线程开始

Thread-0子线程结束

Thread-2子线程开始

Thread-1子线程结束

Thread-3子线程开始

Thread-2子线程结束

Thread-4子线程开始

Thread-3子线程结束

Thread-4子线程结束

子线程执行时长:15000

另外,while(!executor.isTerminated())也可以替代上面的while (!executor.awaitTermination(10,TimeUnit.SECONDS)),isTerminated()是用来判断线程池是否执行完成。但是二者比较我认为还是awaitTermination更好,它有一个超时时间可以控制每隔多久循环一次,而不是一直在循环来消耗性能。