import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * * 保护一个重要(代码)部分防止一次超过 N 个线程进入。 在N 个线程之间发送信号。 * @author fansxnet * */ public class SemaphoreTest { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 获取许可 semp.acquire(); System.out.println(System.currentTimeMillis()+":Accessing: " + NO); Thread.sleep((long) (Math.random() * 10000)); // 访问完后,释放 ,如果屏蔽下面的语句,则在控制台只能打印5条记录,之后线程一直阻塞 semp.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } // 退出线程池 exec.shutdown(); } }
1489915492740:Accessing: 0
1489915492746:Accessing: 1
1489915492748:Accessing: 2
1489915492749:Accessing: 3
1489915492749:Accessing: 4
1489915493792:Accessing: 5
1489915495852:Accessing: 6
1489915497145:Accessing: 8
1489915497299:Accessing: 7
1489915497681:Accessing: 9
1489915499427:Accessing: 10
1489915501457:Accessing: 11
1489915503579:Accessing: 12
1489915503953:Accessing: 13
1489915504278:Accessing: 14
1489915504941:Accessing: 15
1489915505704:Accessing: 16
1489915506731:Accessing: 17
1489915507014:Accessing: 18
1489915507420:Accessing: 19
import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。 * @author fansxnet 该程序用来模拟发送命令与执行命令,主线程代表指挥官,新建3个线程代表战士,战士一直等待着指挥官下达命令, * 若指挥官没有下达命令,则战士们都必须等待。一旦命令下达,战士们都去执行自己的任务,指挥官处于等待状态,战士们任务执行完毕则报告给 * 指挥官,指挥官则结束等待。 */ public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); // 创建一个线程池 final CountDownLatch cdOrder = new CountDownLatch(1);// 指挥官的命令,设置为1,指挥官一下达命令,则cutDown,变为0,战士们执行任务 final CountDownLatch cdAnswer = new CountDownLatch(3);// 因为有三个战士,所以初始值为3,每一个战士执行任务完毕则cutDown一次,当三个都执行完毕,变为0,则指挥官停止等待。 for (int i = 0; i < 3; i++) { Runnable runnable = new Runnable() { public void run() { try { System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令"); cdOrder.await(); // 战士们都处于等待命令状态 System.out.println("线程" + Thread.currentThread().getName() + "已接受命令"); Thread.sleep((long) (Math.random() * 10000)); System.out.println("线程" + Thread.currentThread().getName() + "回应命令处理结果"); cdAnswer.countDown(); // 任务执行完毕,返回给指挥官,cdAnswer减1。 } catch (Exception e) { e.printStackTrace(); } } }; service.execute(runnable);// 为线程池添加任务 } try { Thread.sleep((long) (Math.random() * 10000)); System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令"); cdOrder.countDown(); // 发送命令,cdOrder减1,处于等待的战士们停止等待转去执行任务。 System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果"); cdAnswer.await(); // 命令发送后指挥官处于等待状态,一旦cdAnswer为0时停止等待继续往下执行 System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果"); } catch (Exception e) { e.printStackTrace(); } service.shutdown(); // 任务结束,停止线程池的所有线程 } }
线程pool-1-thread-1正准备接受命令
线程pool-1-thread-2正准备接受命令
线程pool-1-thread-3正准备接受命令
线程main即将发布命令
线程main已发送命令,正在等待结果
线程pool-1-thread-1已接受命令
线程pool-1-thread-2已接受命令
线程pool-1-thread-3已接受命令
线程pool-1-thread-1回应命令处理结果
线程pool-1-thread-2回应命令处理结果
线程pool-1-thread-3回应命令处理结果
线程main已收到所有响应结果
import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。 * 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。 * 在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。 因为该 barrier * * 在释放等待线程后可以重用,所以称它为循环 的 barrier。 * 需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。 * * @author fansxnet * */ public class CyclicBarrierTest { private static final int STUDENT_NUM = 10; public static void main(String[] args) { // TODO Auto-generated method stub Runnable teacher = new Runnable() { // 当所有线程到达barrier时执行 public void run() { System.out.println("同学们,咱们出发"); } }; final CyclicBarrier cb = new CyclicBarrier(STUDENT_NUM, teacher); ExecutorService executor = Executors.newFixedThreadPool(STUDENT_NUM); for (int i = 0; i < STUDENT_NUM; i++) { final int studentId = i; executor.submit(new Runnable() { public void run() { // TODO Auto-generated method stub try { System.out.println("学生:" + studentId + " 等待"); // 线程在这里等待,直到所有线程都到达barrier。 cb.await(); System.out.println("学生:" + studentId + " 出发"); } catch (Exception e) { e.printStackTrace(); } } }); } } }
学生:1 等待
学生:0 等待
学生:2 等待
学生:3 等待
学生:4 等待
学生:5 等待
学生:6 等待
学生:7 等待
学生:8 等待
学生:9 等待
同学们,咱们出发
学生:9 出发
学生:1 出发
学生:4 出发
学生:3 出发
学生:2 出发
学生:0 出发
学生:8 出发
学生:7 出发
学生:6 出发
学生:5 出发
看看 http://blog.csdn.net/defonds/article/details/44021605/
相关推荐
4.1 CountDownLatch 4.2 CyclicBarrier 4.3 Semaphore 4.4 Exchanger 第五章:原子类和无锁编程 5.1 AtomicInteger与AtomicLong 5.2 AtomicReference 第六章:线程池及其应用 6.1 ThreadPoolExecutor 6.2...
CountDownLatch、CyclicBarrier 和 Semaphore 等多线程协作机制都是 Java 并发编程中的重要组成部分。它们可以帮助开发者编写高效、可靠的多线程程序,解决复杂的并发问题。 在实际开发中,我们可以根据具体情况...
CountDownLatch、CyclicBarrier、Semaphore等同步器在多线程协同工作中起到关键作用。CountDownLatch用于一次性释放多个等待线程,CyclicBarrier则让一组线程等待直到所有线程到达屏障点,Semaphore则控制对共享...
JUC 什么是死锁?如何避免死锁? 什么是可重入锁? CountDownLatch CyclicBarrier Semaphore 什么是自旋锁(CAS,compare and swap)? CAS存在的问题 什么是读写锁? 谈谈并发编程三要素 简述Java内存模型(JMM) ...
5. **并发工具类**:CountDownLatch、CyclicBarrier、Semaphore等工具类用于协调多个线程间的交互。例如,CountDownLatch可以等待所有线程完成后再继续执行,CyclicBarrier则让一组线程到达一个屏障时暂停,直到所有...
3. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore等,它们是协调多个线程之间同步的工具,用于控制并发流程的执行。 4. **Future和Callable接口**:Future代表异步计算的结果,Callable表示一个带有...
5. **并发工具类**:包括CountDownLatch、CyclicBarrier、Semaphore、Exchanger等,这些工具可以帮助开发者协调多个线程间的协作,实现复杂的并发控制逻辑。 6. **Future和CompletableFuture**:讲解如何使用Future...
JUC是什么 线程 进程 / 线程 线程状态 wait / sleep 并发 / 并行 Lock 使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 Condition 定制化通信 多线程...
CountDownLatch/CyclicBarrier/Semaphore CountDownLatch 枚举类的使用 CyclicBarrier Semaphore 阻塞队列 SynchronousQueue Callable接口 阻塞队列的应用——生产者消费者 传统模式 阻塞队列模式 阻塞队列的应用...
如线程池(ExecutorService)、并发容器(ConcurrentHashMap、CopyOnWriteArrayList等)、锁机制(ReentrantLock、Semaphore等)、原子类(AtomicInteger、AtomicReference等)以及并发工具类(CountDownLatch、...
本篇内容将详细介绍JUC中的一些核心组件及其使用方法,包括CountDownLatch、Executors、Semaphore、Exchanger、CyclicBarrier、LinkedBlockingQueue、ThreadFactory等。 首先,我们来探讨一下Executors工具类。...
- **并发工具类**:掌握`CountDownLatch`, `CyclicBarrier`, `Semaphore`等工具类的应用场景和使用方法。 通过这个"JUC代码收集",你可以深入研究这些概念的实际应用,通过实例代码来加深理解。同时,这也会帮助你...
6. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore等,用于协调多线程间的同步。例如,CountDownLatch常用于等待一组线程完成;CyclicBarrier允许一组线程到达一个屏障时暂停,直到所有线程都到达;...
3. **同步器**:如`Semaphore`、`CountDownLatch`、`CyclicBarrier`等,它们可以帮助解决复杂的同步问题。 4. **原子变量**:如`AtomicInteger`、`AtomicLong`等,这些类提供了一种无需显式加锁即可实现线程安全的...
CountDownLatch和CyclicBarrier是协调多个线程的工具。CountDownLatch允许一个或多个线程等待其他线程完成操作,通常用于启动阶段的同步;CyclicBarrier则让一组线程等待所有线程到达屏障点后再一起继续执行,适合在...
9. **CyclicBarrier和CountDownLatch** - `CyclicBarrier`用于多线程间的同步,允许一组线程等待其他线程到达某个屏障点后一起继续执行。 - `CountDownLatch`则是一个一次性的计数器,用于让一个线程等待其他线程...
首先,JUC库中的`java.util.concurrent`包包含了大量并发工具类,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`CountDownLatch`(倒计时门锁)等。这些工具类可以帮助开发者更精细地控制并发执行的流程...
并发编程是多线程环境下的程序设计,它允许在单个处理器或多个处理器上同时执行...CountDownLatch、CyclicBarrier、Semaphore 等工具)。理解这些工具的工作原理和使用场景,能够帮助开发者编写高效且安全的并发程序。
`CountDownLatch`和`CyclicBarrier`则是协调多个线程同步的工具,前者用于一次性阻塞等待,后者则允许线程反复使用,直到达到预设的屏障点。 最后,`CompletableFuture`是Java 8引入的异步编程工具,它提供了链式...
Java并发工具包提供了一系列高效、线程安全的类,如并发容器(ConcurrentHashMap、ConcurrentLinkedQueue等)、锁(ReentrantLock、ReadWriteLock)和同步器(CountDownLatch、CyclicBarrier、Semaphore)。...