利用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();
}
}
本文通过Java并发工具类CountDownLatch和CyclicBarrier展示了如何实现多线程任务同步。使用CountDownLatch,四个线程分别统计C、D、E、F盘,完成后主线程执行合计操作。而CyclicBarrier则在所有线程完成各自任务(统计各盘)后执行屏障行动,打印统计结果。这两个工具提供了有效的线程协调机制。
1837

被折叠的 条评论
为什么被折叠?



