java Semaphore实现ABC三个线程循环打印
Semaphore位于java.util.concurrent包下。其中有两个重要的方法acquire()和release()。acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号量,则获取成功,可用信号量减1,使用完后可用release释放信号量。
下面的例子有ABC三个线程。A负责输出1 4 7 B负责输出2 5 8 C负责3 6 9。要求通过信号量机制 控制这三个线程按照顺序输出。
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public int i=1;
//设置信号量,用来控制可以同时访问的线程数量
public Semaphore s1 = new Semaphore(1);
public Semaphore s2 = new Semaphore(0);
public Semaphore s3 = new Semaphore(0);
public static void main(String[] args) {
new SemaphoreTest().Print();
}
public void Print() {
//创建一个可缓存线程池
ExecutorService exe = Executors.newCachedThreadPool();
Thread t1 = new Thread(){
@Override
public void run() {
while(i<7) {
try {
s1.acquire();//获取信号量,s1 - 1
System.out.print(i);
i++;
//方便看到运行结果
Thread.sleep(1000);
s2.release();//释放信号量,s2 + 1
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
while(i<8) {
try {
s2.acquire();//获取信号量,s2 - 1
System.out.print(i);
i++;
Thread.sleep(1000);
s3.release();//释放信号量,s3 + 1
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread t3 = new Thread(){
@Override
public void run() {
while(i<9) {
try {
s3.acquire();//获取信号量,s3 - 1
System.out.print(i);
i++;
Thread.sleep(1000);
s1.release();//释放信号量,s1 + 1
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
exe.execute(t1);
exe.execute(t2);
exe.execute(t3);
}
}
运行结果:
相关的博客:
Semaphore的工作原理及实例
java并发编程之Semaphore原理分析与实例
Java并发33:Semaphore基本方法与应用场景实例
java Semaphore实现ABC三个线程循环打印的更多相关文章
- Java Thread系列(三)线程安全
Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...
- 使用Java实现三个线程交替打印0-74
使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...
- Java多线程:用三个线程控制循环输出10次ABC
转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- 【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...
- java并发编程(三)----线程的同步
在现实开发中,我们或多或少的都经历过这样的情景:某一个变量被多个用户并发式的访问并修改,如何保证该变量在并发过程中对每一个用户的正确性呢?今天我们来聊聊线程同步的概念. 一般来说,程序并行化是为了获得 ...
- 用三个线程循环输出ABC
前两天看Java吧有人求助这个问题.想了想并不是很难.今天就顺手实现了一下. 我自己想到的有两种方法,一个是使用synchronized,一个是使用lock. 一.synchronized packa ...
随机推荐
- 并发系列(二)——FutureTask类源码简析
背景 本文基于JDK 11,主要介绍FutureTask类中的run().get()和cancel() 方法,没有过多解析相应interface中的注释,但阅读源码时建议先阅读注释,明白方法的主要的功 ...
- 计划工程师dadafksjh
Markdown常规语法 标题 # 代表一级标题 ## 代表二级标题 -- ####### 代表六级标题 一级标题 二级标题 三级标题 六级标题 列表 有序列表 1. 数字1 + . + 空格 无序列 ...
- Bug--Mybatis报错:There is no getter for property named 'id' in 'class java.lang.Integer'
Mybatis 添加@Param("")注释就可以了
- 12天,这本《重学Java设计模式》PDF书籍下载量9k,新增粉丝1400人,Github上全球推荐榜!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言
- Logback配置文件这么写,还愁不会整理日志?
摘要: 1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件 2.通过异步输出日志减少磁盘IO提高性能 3.异步输出日志的原理 1.配置文件logback-spring.xml Spring ...
- darkbzoj #3759. Hungergame 博弈论 线性基 NIM
LINK:Hungergame 放上一道简单题 复习一下. 考虑每次可以打开任意多个盒子 如果全打开了 那么就是一个NIM游戏了. 如果发现局面是异或为0的时候此时先手必胜了. 考虑局面不全体异或为0 ...
- 安装ElasticSearch遇到的深坑
实验需要ES,安装过程中遇到一些奇葩的问题,记录下.下面介绍下安装步骤: 第一步:安装java ES是运行在java虚拟机上面的,所以首先需要安装java环境,安装过程不再赘述,唯一需要注意的是ES对 ...
- markdown利器-小书匠
markdown利器-小书匠 为什么要用markdown语法编写文档? 编写文档的好处这里就不多说了.相信很多人都会在一些博客网站上发布自己的博客,那么怎么能使得自己的博客内容更加具有通用性呢?正如j ...
- jsp应用-实现用户登陆功能
项目结构 1.login.jsp 这个没什么好说的,把表单提交到校验页面进行校验 2.首先获取request域中user,password,然后进行校验,校验成功把信息存入session域,然后转发到 ...
- .Net Core中简单使用MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式且面向文档存储的开源数据库系统. 下载地址: https://www.mongodb.com/download-center/community ...