`

juc之CountDownLatch、CyclicBarrier和Semaphore例子

    博客分类:
  • J2EE
 
阅读更多

 

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/

分享到:
评论

相关推荐

    JUC面试知识点手册快速版

    4.1 CountDownLatch 4.2 CyclicBarrier 4.3 Semaphore 4.4 Exchanger 第五章:原子类和无锁编程 5.1 AtomicInteger与AtomicLong 5.2 AtomicReference 第六章:线程池及其应用 6.1 ThreadPoolExecutor 6.2...

    Java并发编程-3.pdf

    CountDownLatch、CyclicBarrier 和 Semaphore 等多线程协作机制都是 Java 并发编程中的重要组成部分。它们可以帮助开发者编写高效、可靠的多线程程序,解决复杂的并发问题。 在实际开发中,我们可以根据具体情况...

    JUC线程锁框架

    CountDownLatch、CyclicBarrier、Semaphore等同步器在多线程协同工作中起到关键作用。CountDownLatch用于一次性释放多个等待线程,CyclicBarrier则让一组线程等待直到所有线程到达屏障点,Semaphore则控制对共享...

    java并发编程面试题分享给需要的同学.docx

    JUC 什么是死锁?如何避免死锁? 什么是可重入锁? CountDownLatch CyclicBarrier Semaphore 什么是自旋锁(CAS,compare and swap)? CAS存在的问题 什么是读写锁? 谈谈并发编程三要素 简述Java内存模型(JMM) ...

    juc源码视频教程最全

    5. **并发工具类**:CountDownLatch、CyclicBarrier、Semaphore等工具类用于协调多个线程间的交互。例如,CountDownLatch可以等待所有线程完成后再继续执行,CyclicBarrier则让一组线程到达一个屏障时暂停,直到所有...

    AQS和JUC知识点讲解

    3. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore等,它们是协调多个线程之间同步的工具,用于控制并发流程的执行。 4. **Future和Callable接口**:Future代表异步计算的结果,Callable表示一个带有...

    JUC并发编程与源码分析视频课.zip

    5. **并发工具类**:包括CountDownLatch、CyclicBarrier、Semaphore、Exchanger等,这些工具可以帮助开发者协调多个线程间的协作,实现复杂的并发控制逻辑。 6. **Future和CompletableFuture**:讲解如何使用Future...

    这就是标题—— JUC.pdf

    JUC是什么 线程 进程 / 线程 线程状态 wait / sleep 并发 / 并行 Lock 使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 Condition 定制化通信 多线程...

    常见的Java笔试题-JVM-JUC-Core:JUCJVM核心知识点

    CountDownLatch/CyclicBarrier/Semaphore CountDownLatch 枚举类的使用 CyclicBarrier Semaphore 阻塞队列 SynchronousQueue Callable接口 阻塞队列的应用——生产者消费者 传统模式 阻塞队列模式 阻塞队列的应用...

    个人学习JUC代码笔记总集

    如线程池(ExecutorService)、并发容器(ConcurrentHashMap、CopyOnWriteArrayList等)、锁机制(ReentrantLock、Semaphore等)、原子类(AtomicInteger、AtomicReference等)以及并发工具类(CountDownLatch、...

    java之JUC系列.pdf

    本篇内容将详细介绍JUC中的一些核心组件及其使用方法,包括CountDownLatch、Executors、Semaphore、Exchanger、CyclicBarrier、LinkedBlockingQueue、ThreadFactory等。 首先,我们来探讨一下Executors工具类。...

    JUC代码收集,java高并发多线程学习

    - **并发工具类**:掌握`CountDownLatch`, `CyclicBarrier`, `Semaphore`等工具类的应用场景和使用方法。 通过这个"JUC代码收集",你可以深入研究这些概念的实际应用,通过实例代码来加深理解。同时,这也会帮助你...

    java.util.concurrent 测试源文件

    6. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore等,用于协调多线程间的同步。例如,CountDownLatch常用于等待一组线程完成;CyclicBarrier允许一组线程到达一个屏障时暂停,直到所有线程都到达;...

    尚硅谷JUC百度云连接

    3. **同步器**:如`Semaphore`、`CountDownLatch`、`CyclicBarrier`等,它们可以帮助解决复杂的同步问题。 4. **原子变量**:如`AtomicInteger`、`AtomicLong`等,这些类提供了一种无需显式加锁即可实现线程安全的...

    【学习笔记】JUC基础基础程序

    CountDownLatch和CyclicBarrier是协调多个线程的工具。CountDownLatch允许一个或多个线程等待其他线程完成操作,通常用于启动阶段的同步;CyclicBarrier则让一组线程等待所有线程到达屏障点后再一起继续执行,适合在...

    Java——JUC

    9. **CyclicBarrier和CountDownLatch** - `CyclicBarrier`用于多线程间的同步,允许一组线程等待其他线程到达某个屏障点后一起继续执行。 - `CountDownLatch`则是一个一次性的计数器,用于让一个线程等待其他线程...

    juc学习代码。。。。

    首先,JUC库中的`java.util.concurrent`包包含了大量并发工具类,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`CountDownLatch`(倒计时门锁)等。这些工具类可以帮助开发者更精细地控制并发执行的流程...

    并发编程、juc工具包源码分析笔记

    并发编程是多线程环境下的程序设计,它允许在单个处理器或多个处理器上同时执行...CountDownLatch、CyclicBarrier、Semaphore 等工具)。理解这些工具的工作原理和使用场景,能够帮助开发者编写高效且安全的并发程序。

    JUC学习笔记(Java多线程)

    `CountDownLatch`和`CyclicBarrier`则是协调多个线程同步的工具,前者用于一次性阻塞等待,后者则允许线程反复使用,直到达到预设的屏障点。 最后,`CompletableFuture`是Java 8引入的异步编程工具,它提供了链式...

    JAVA知识图谱:JVM、JMM、JUC、NIO、Netty、IOC、AOP、Jav-JavaKnowledge.zip

    Java并发工具包提供了一系列高效、线程安全的类,如并发容器(ConcurrentHashMap、ConcurrentLinkedQueue等)、锁(ReentrantLock、ReadWriteLock)和同步器(CountDownLatch、CyclicBarrier、Semaphore)。...

Global site tag (gtag.js) - Google Analytics