JDK源码之线程并发协调神器CountDownLatch和CyclicBarrier详解
在Java并发编程中,经常需要进行线程间的协调,以达到控制线程执行顺序、提高程序运行效率等目的。CountDownLatch和CyclicBarrier是Java中最常用的线程协调工具,本文将详细介绍这两个工具的用法和源码实现细节。
CountDownLatch
CountDownLatch是一种多线程控制工具,它可以使一个或多个线程等待一组线程完成某些操作后再执行。CountDownLatch中维护一个计数器,初始值为计数器的数量,每个线程完成任务时将计数器减1,直到计数器变为0,阻塞在CountDownLatch上等待的线程才继续执行。
下面是一个CountDownLatch的简单示例:
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2);
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " starts to run.");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " finishes.");
latch.countDown();
}, "Thread-1").start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " starts to run.");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " finishes.");
latch.countDown();
}, "Thread-2").start();
System.out.println(Thread.currentThread().getName() + " is waiting.");
latch.await();
System.out.println(Thread.currentThread().getName() + " continues to run.");
}
}
以上代码中,我们创建了一个CountDownLatch并设置计数器值为2,启动两个线程模拟执行任务,并在任务完成后通过countDown()方法将计数器-1,最后在主线程中通过await()方法阻塞等待两个任务执行完成,当计数器为0时,主线程继续执行。
CyclicBarrier
CyclicBarrier也是一种多线程控制工具,它允许定义一组固定数量的线程,在所有线程都达到一个屏障点时,再同时触发执行某个操作。CyclicBarrier可以反复使用,即达到屏障点后,线程可以重新开始进入下一个循环执行。
下面是一个CyclicBarrier的简单示例:
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads are ready."));
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " is ready.");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " continues to run.");
}, "Thread-1").start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " is ready.");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " continues to run.");
}, "Thread-2").start();
System.out.println(Thread.currentThread().getName() + " is ready.");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " continues to run.");
}
}
以上代码中,我们创建了一个CyclicBarrier并设置固定数量为3,在三个线程都到达屏障点时,打印一行提示信息。我们启动两个线程和主线程,并在每个线程到达屏障点后调用await()方法阻塞等待,当所有线程都到达屏障点时,才会一起继续执行。
总结
CountDownLatch和CyclicBarrier是Java中非常实用的线程协调工具,具有灵活性和易用性。在多线程编程中,合理运用这两个工具可以达到控制线程执行顺序、优化程序性能等目的,也可以配合其他锁和同步机制使用,提高程序的并发性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDK源码之线程并发协调神器CountDownLatch和CyclicBarrier详解 - Python技术站