CountDownLatch和CyclicBarrier学习
发布人:shili8
发布时间:2025-03-13 06:42
阅读次数:0
**CountDownLatch 和 CyclicBarrier 学习**
在 Java 中,`CountDownLatch` 和 `CyclicBarrier` 是两个非常有用的类,它们可以帮助我们实现线程之间的同步和协调。虽然它们看起来很相似,但它们的使用场景却是不同的。
### CountDownLatch`CountDownLatch` 是一个计数器,当它的值达到0 时,所有等待其释放的线程都会被唤醒。它可以用来实现多个线程之间的同步和协调。
#### 使用示例
javaimport java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) throws InterruptedException { // 创建一个CountDownLatch对象,初始值为3 CountDownLatch latch = new CountDownLatch(3); // 创建三个线程,每个线程都要等待latch的值达到0才继续执行 Thread thread1 = new Thread(() -> { System.out.println("Thread1: Waiting for latch..."); try { latch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Thread1: Latch released, continuing..."); }); Thread thread2 = new Thread(() -> { System.out.println("Thread2: Waiting for latch..."); try { latch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Thread2: Latch released, continuing..."); }); Thread thread3 = new Thread(() -> { System.out.println("Thread3: Waiting for latch..."); try { latch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Thread3: Latch released, continuing..."); }); // 启动三个线程 thread1.start(); thread2.start(); thread3.start(); // 等待所有线程执行完毕 latch.countDown(); // 将latch的值减少为0 System.out.println("Main: Latch released, all threads finished."); } }
在这个示例中,我们创建了一个 `CountDownLatch` 对象,初始值为3。然后我们启动三个线程,每个线程都要等待 `latch` 的值达到0 才继续执行。在 `main` 线程中,我们先将 `latch` 的值减少为0,然后等待所有线程执行完毕。
### CyclicBarrier`CyclicBarrier` 是一个循环屏障,当它的值达到0 时,所有等待其释放的线程都会被唤醒。与 `CountDownLatch` 不同的是,`CyclicBarrier` 可以重复使用,而不是只有一次使用。
#### 使用示例
javaimport java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierExample { public static void main(String[] args) throws InterruptedException, BrokenBarrierException { // 创建一个CyclicBarrier对象,初始值为3 CyclicBarrier barrier = new CyclicBarrier(3); // 创建三个线程,每个线程都要等待barrier的值达到0才继续执行 Thread thread1 = new Thread(() -> { System.out.println("Thread1: Waiting for barrier..."); try { barrier.await(); } catch (BrokenBarrierException e) { Thread.currentThread().interrupt(); } System.out.println("Thread1: Barrier released, continuing..."); }); Thread thread2 = new Thread(() -> { System.out.println("Thread2: Waiting for barrier..."); try { barrier.await(); } catch (BrokenBarrierException e) { Thread.currentThread().interrupt(); } System.out.println("Thread2: Barrier released, continuing..."); }); Thread thread3 = new Thread(() -> { System.out.println("Thread3: Waiting for barrier..."); try { barrier.await(); } catch (BrokenBarrierException e) { Thread.currentThread().interrupt(); } System.out.println("Thread3: Barrier released, continuing..."); }); // 启动三个线程 thread1.start(); thread2.start(); thread3.start(); // 等待所有线程执行完毕 System.out.println("Main: All threads finished."); } }
在这个示例中,我们创建了一个 `CyclicBarrier` 对象,初始值为3。然后我们启动三个线程,每个线程都要等待 `barrier` 的值达到0 才继续执行。在 `main` 线程中,我们不需要将 `barrier` 的值减少为0,因为 `CyclicBarrier` 可以重复使用。
### 总结在本文中,我们学习了 `CountDownLatch` 和 `CyclicBarrier` 这两个非常有用的类,它们可以帮助我们实现线程之间的同步和协调。虽然它们看起来很相似,但它们的使用场景却是不同的。`CountDownLatch` 可以用来实现多个线程之间的同步和协调,而 `CyclicBarrier` 可以重复使用,适合于需要多次等待的场景。