semaphore是java.util.concurrent包下的并发工具类。

A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the semaphore just keeps a count of the number available and acts accordingly.Semaphores are often used to restrict the number of threads than can access some (physical or logical) resource.

大致意思是semaphore可以持有许可证,可以在初始化时指定,执行一次acquire(),获取一个许可证,线程进入,当许可证为0,则不再允许线程进入,执行一次release释放一个许可证。

package com.smikevon.concurrent.tools;import java.util.Random;
import java.util.concurrent.Semaphore;/*** @description: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C.要求, 同时启动三个线程, 按顺序输出ABC, 循环10次* @date       : 2014年9月17日 下午8:23:05*/
public class TestSemaphore {public static void main(String[] args) {final Semaphore sa = new Semaphore(1);final Semaphore sb = new Semaphore(0);final Semaphore sc = new Semaphore(0);final Random random = new Random(System.currentTimeMillis());new Thread(new Runnable() {public void run() {try {while(true){Thread.sleep(random.nextInt(3000));sa.acquire();doing("A");sb.release();}} catch (InterruptedException e) {e.printStackTrace();}}},"线程a").start();new Thread(new Runnable() {public void run() {try {while(true){Thread.sleep(random.nextInt(3000));sb.acquire();doing("B");sc.release();}} catch (InterruptedException e) {e.printStackTrace();}}},"线程b").start();new Thread(new Runnable() {public void run() {try {while(true){Thread.sleep(random.nextInt(3000));sc.acquire();doing("C");sa.release();}} catch (InterruptedException e) {e.printStackTrace();}}},"线程c").start();}/*** @Description:打印出线程的名字* @param msg* @returType:void*/public static void doing(String msg){System.out.println(Thread.currentThread().getName()+":"+msg);}}

转载于:https://www.cnblogs.com/seanvon/p/4072050.html

采用java信号量(semaphore)让线程轮流打印相关推荐

  1. java多线程交替打印_使用Java实现三个线程交替打印0-74

    使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...

  2. java 信号量Semaphore

    在很多情况下,可能有多个线程需要访问数目很少的资源.假想在服务器上运行着若干个回答客户端请求的线程.这些线程需要连接到同一数据库,但任一时刻 只能获得一定数目的数据库连接.你要怎样才能够有效地将这些固 ...

  3. java 线程交替输出,[java]java经典问题之线程交替打印数字

    问题 给出两个线程,要求两个线程交替打印从1到100,例如:A线程打印1,B线程打印2,A线程打印3...依次类推,直到打印到100 思路 这里主要是考察对java中wait/notifyAll机制的 ...

  4. java实现123n_java三线程交替打印123……n

    使用多线程交替打印1--n,a进程打印1,4,7,--(3n+1),b进程打印2,7,10,--(3n+2),c进程打印3,6,9,--(3n) 涉及到多线程的同步,阻塞,wait,notify 代码 ...

  5. java中用两个线程交替打印0-100偶数和奇数

    1.第一种方式,用 synchronized 关键字来实现 public class ThreadDemo {static int count = 0;static Object lock = new ...

  6. 关于线程轮流打印0-99

    使用Reentrantlock实现 package com.wang;import java.util.concurrent.locks.Condition; import java.util.con ...

  7. java go多线程:两个线程交替打印 0~100 的奇偶数

    最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...

  8. Java Semaphore实现线程池任务调度

    2019独角兽企业重金招聘Python工程师标准>>> 关于Semaphore举例 以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来 ...

  9. Java Review - 并发编程_ 信号量Semaphore原理源码剖析

    文章目录 概述 小Demo 类关系概述 核心方法源码解读 void acquire() 非公平策略NonfairSync类的`tryAcquireShared`方法 公平策略`FairSync`类的` ...

最新文章

  1. BestCoder-Round#38
  2. 25岁,在一个需要工作的周末……
  3. 变量之--列表初始化和结构化绑定
  4. hibernate中报错could not initialize proxy - no Session的解决方法
  5. 前端学习(1407):多人管理27代码优化
  6. oracle身份管理器,分析Oracle身份管理器的各个元素(下)
  7. LoRa、LoRaWAN及网关相关技术介绍
  8. “土豪机”8848出新品 手机数据备份保险箱1699起
  9. LeetCode(897)——递增顺序查找树(JavaScript)
  10. Spring的AOP特性
  11. 男单巅峰战林丹力克索尼 再度封王成功卫冕
  12. app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
  13. MFC浮动窗口使用方法和注意事项
  14. android虚拟机模糊,Android studio虚拟机在启动界面和桌面出现画面模糊花屏问题的解决方法...
  15. 图片涂改了怎么给复原_图片马赛克怎么去掉 怎么去除马赛克方法介绍
  16. 超级浏览器究竟是什么?
  17. 拖动或点击CMD窗口造成程序阻塞,在bat文件中关闭cmd窗口的快速编辑模式
  18. 福禄克FLUKE OptiFiber Pro HDR OTDR光时域反射(OTDR)测试仪OFP2-100-S
  19. 如何将已有项目导入SVN
  20. “已取消到该网页的导航” chm文件无法显示错误 解决方法

热门文章

  1. Redis入门到精通-Redis数据类型
  2. 【Android】关于参数的传递问题
  3. 【云栖计算之旅】线下沙龙第2期精彩预告:Docker在云平台上的最佳实践
  4. 轻操作动作休闲单机游戏《狂斩三国2》评测
  5. poj 1274 The Perfect Stall
  6. unix高级环境编程-基础知识
  7. 网管日志-06.07.25
  8. ContextLoaderListener介绍
  9. InputStream 、 InputStreamReader和BufferedReader
  10. python连接sql数据库_python连接sql server数据库实现增删改查