CountDownLatch: 只能使用一次
CyclicBarrier:
可以循环使用
package com.colorcc.multi.thread.jcp;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo
{
private static CountDownLatch cdl = new CountDownLatch(3);
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
executor.execute(new CountDownLatchThread());
}
System.out.println("Main start ...");
cdl.await();
System.out.println("Main after ..."); // main 的语句永远比线程的晚
}
static class CountDownLatchThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " start ...");
System.out.println(Thread.currentThread().getName() + " after ...");
cdl.countDown();
// cdl.countDown(); // 这里算再减一次
}
}
}
某次执行结果:
pool-1-thread-1 start ...
pool-1-thread-1 after ...
pool-1-thread-2 start ...
pool-1-thread-2 after ...
Main start ...
pool-1-thread-3 start ...
pool-1-thread-3 after ...
Main after ... //必然在最后
package com.colorcc.multi.thread.jcp;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierDemo
{
/**
* @param args
*/
public static void main(String[] args) {
final CyclicBarrier cb = new CyclicBarrier(3, new Runnable() {
//每次 await() 后调用此方法
@Override
public void run() {
System.out.println("Succeed.");
}
});
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " before.");
// try {
// Thread.sleep(200);
// } catch (InterruptedException e1) {
// e1.printStackTrace();
// }
System.out.println(Thread.currentThread().getName() + " after sleep.");
try {
cb.await(); //等待点1: 所有线程执行到此,等待别人都执行完成,继续向下
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " middle.");
try {
cb.await(); //等待点2: 所有线程执行到此,再次等待别人都执行完成,继续向下
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " after.");
try {
cb.await(); //等待点3: 所有线程执行到此,再次等待别人都执行完成,继续向下
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " last.");
}
});
}
System.out.println("Main done.");
}
}
某次执行结果:
pool-1-thread-1 before. //可以无序
pool-1-thread-2 before.
pool-1-thread-2 after sleep.
pool-1-thread-3 before.
pool-1-thread-3 after sleep.
Main done.
pool-1-thread-1 after sleep.
Succeed.
pool-1-thread-1 middle. //等待点1后
pool-1-thread-2 middle.
pool-1-thread-3 middle.
Succeed.
pool-1-thread-3 after. //等待点2后
pool-1-thread-2 after.
pool-1-thread-1 after.
Succeed.
pool-1-thread-1 last. //等待点3后
pool-1-thread-3 last.
pool-1-thread-2 last.
分享到:
相关推荐
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...
在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
总结一下,CountDownLatch和CyclicBarrier的主要区别在于: - **CountDownLatch** 是单次使用的,一旦计数器归零,就不能再复用。 - **CyclicBarrier** 可以重用,线程到达屏障点后,屏障会自动重置,允许线程再次...
### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...
在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...
java 高并发应用场景
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...
在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...
Java并发编程之美_部分71 本节主要讲解了Java并发包中线程同步器原理剖析,...本节主要讲解了 CountDownLatch 和 CyclicBarrier 的使用和原理剖析,了解了它们的使用场景和区别,可以更好地使用它们来实现线程同步。
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。
下面我们将深入探讨CountDownLatch的原理、使用方法以及与CyclicBarrier的区别。 首先,CountDownLatch的构造函数接受一个整数参数`count`,这个值表示计数器的初始值。当这个计数器归零时,所有等待在`await()`...
蓝桥杯leetcode 仓库内容是学习Java时所用的一些测试demo: 1. Cloneable ...CountDownLatch和CyclicBarrier区别 12. LanQiao 蓝桥杯的测试 13. LeetCode 在LeetCode刷的题 14. Test 一些偶尔的测试
4.1 CountDownLatch 4.2 CyclicBarrier 4.3 Semaphore 4.4 Exchanger 第五章:原子类和无锁编程 5.1 AtomicInteger与AtomicLong 5.2 AtomicReference 第六章:线程池及其应用 6.1 ThreadPoolExecutor 6.2...
目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项
1. **CountDownLatch与CyclicBarrier的区别**:CountDownLatch是一次性的,计数到零后无法重用;CyclicBarrier可以重置,允许多次同步点。 2. **如何避免死锁与饥饿**:在使用CountDownLatch时,要确保所有线程都能...
内容概要:本文详细介绍了Java线程的基本概念、线程的安全与同步机制、多种线程间通信方式、Java内存模型,以及线程池的原理与使用...和并发控制组件如synchronized、ReentrantLock、CountDownLatch、CyclicBarrier等...
CountDownLatch、CyclicBarrier 和 Semaphore 等多线程协作机制都是 Java 并发编程中的重要组成部分。它们可以帮助开发者编写高效、可靠的多线程程序,解决复杂的并发问题。 在实际开发中,我们可以根据具体情况...