闭锁(CountDownLatch)
package japan.example.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class CountDownLatchTest { public static void main(String[] args) throws Exception { CountDownLatchTest test = new CountDownLatchTest(); test.test(); } public void test() throws InterruptedException { int nthread = 5; ExecutorService service = Executors.newFixedThreadPool(nthread); CountDownLatch latch = new CountDownLatch(nthread); for (int i = 0; i < nthread; i++) { service.execute(new Runner(latch)); } latch.await(); service.shutdown(); while (!service.isTerminated()) { try { // 用于等待子线程结束,再继续执行下面的代码 service.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Runner implements Runnable { CountDownLatch latch; Runner(CountDownLatch latch) { this.latch = latch; } @Override public void run() { try { // dosomething System.err.println("say hello!"); } finally { latch.countDown(); } } }