利用java.util.concurrent包下的CountDownLatch(减数器)或CyclicBarrier(循环栅栏)可以实现此类问题
1. 利用CountDownLatch 的代码实现
public class test1{ public static void main(String[] args) throws Exception { //创建一个能容纳4个线程的减数器 final CountDownLatch countDownLatch= new CountDownLatch(4); Runnable runC= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("统计C盘"); countDownLatch.countDown();//单任务,把计数器减1 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable runD= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("统计D盘"); countDownLatch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable runE= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("统计E盘"); countDownLatch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable runF= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("统计F盘"); countDownLatch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; ExecutorService service= Executors.newFixedThreadPool(4); service.submit(runC); service.submit(runD); service.submit(runE); service.submit(runF); countDownLatch.await();//主线程,即第5线程等待 System.out.println("合计C,D,E,F"); service.shutdown(); } }
2. 利用CyclicBarrier的代码实现
public class test2{ public static void main(String[] args) { Runnable barrierAction= new Runnable() { @Override public void run() { System.out.println("统计C,D,E,F盘"); } }; final CyclicBarrier cyclicBarrier= new CyclicBarrier(4, barrierAction ); Runnable runC= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("C盘"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }; Runnable runD= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("D盘"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }; Runnable runE= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("E盘"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }; Runnable runF= new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("F盘"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }; ExecutorService service= Executors .newFixedThreadPool(4); service.submit(runC); service.submit(runD); service.submit(runE); service.submit(runF); service.shutdown(); } }