三个线程按循序一个打印A一个打印B一个打印C 循环打印?
第一种
public static volatile int flag = 1;
public static void printABC1(){
Thread t1 = new Thread(() -> {
while (true) {
synchronized (obj1) {
while (flag != 1){
try {
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T1:A");
Thread.sleep(1000);
flag = 2;
obj1.notifyAll();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(() -> {
while (true) {
synchronized (obj1) {
while (flag != 2){
try {
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T2:B");
Thread.sleep(1000);
flag = 3;
obj1.notifyAll();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread t3 = new Thread(() -> {
while (true) {
synchronized (obj1) {
while (flag != 3){
try {
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T3:C");
Thread.sleep(1000);
flag = 1;
obj1.notifyAll();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
t3.start();
}
第二种
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition1 = lock.newCondition();
public static volatile int flag2 = 0;
public static void printABC2(){
Thread t1 = new Thread(() -> {
while (true){
lock.lock();
while (flag2 % 3 != 0){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T1:A");
Thread.sleep(1000);
flag2++;
condition1.signalAll();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
});
Thread t2 = new Thread(() -> {
while (true) {
lock.lock();
while (flag2 % 3 != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T2:B");
Thread.sleep(1000);
flag2++;
condition1.signalAll();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
});
Thread t3 = new Thread(() -> {
while (true) {
lock.lock();
while (flag2 % 3 != 2){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T3:C");
Thread.sleep(1000);
flag2++;
condition1.signalAll();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
});
t1.start();
t2.start();
t3.start();
}
三个线程按循序一个打印A一个打印B一个打印C 循环打印?的更多相关文章
- 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...
- 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)
前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC 实现代码如下: using System; using System.Collections.Generi ...
- 使用Java实现三个线程交替打印0-74
使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- 有三个线程,a、b、c,a打印“T1”,b打印“T2”,c打印“T3”,a执行完后,b执行;b执行完后,c执行。如此循环100遍
有三个线程,a.b.c,a打印“T1”,b打印“T2”,c打印“T3”,a执行完后,b执行:b执行完后,c执行.如此循环100遍. package com.company; /** * 测试三个线程协 ...
- 开启两个线程,一个线程打印A~Z,一个线程打印1~52的数据
开启两个线程,一个线程打印A-Z,一个线程打印1-52的数据 import java.util.concurrent.locks.Condition; import java.util.concurr ...
- java Semaphore实现ABC三个线程循环打印
Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...
随机推荐
- 深入浅出图神经网络 第6章 GCN的性质 读书笔记
第6章 GCN的性质 第5章最后讲到GCN结束的有些匆忙,作为GNN最经典的模型,其有很多性质需要我们去理解. 6.1 GCN与CNN的区别与联系 CNN卷积卷的是矩阵某个区域内的值,图卷积在空域视角 ...
- Linux | Shell脚本的编写
Shell 脚本的介绍 Shell脚本通过Shell终端解释器当作人与计算机硬件之间的翻译官,用户可以通过它执行各种命令,不仅有简单的,还有复杂的,比如:判断.循环.分支等这些高级编程中才有的特性.S ...
- external-resizer 源码分析/pvc 扩容分析
kubernetes ceph-csi分析目录导航 基于tag v0.5.0 https://github.com/kubernetes-csi/external-resizer/releases/t ...
- python使用笔记28--unittest单元测试框架
单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 unittest框架,执行的顺序是按照方法名的字母来排序的 setUpClass方法是最开始执行的 tearDo ...
- PYTHON3.4.4 升级pip
python -m pip install --upgrade pipupgrade 前面是两个 "-"
- easyui-textbox使用value设置默认值失效
1,使用easyu-textbox的value参数设置默认值失效,easyui-textbox放到dialog弹框中,当dialog的closed为false时,也就是打开dialog时,设置的val ...
- JavaScript学习之路(个人理解&经验):构造函数、类、实例
构造函数: 声明:"构造函数"是一类函数的 "名字" 正确的读法是"构造函数"而不是"构造 / 函数" 构造函数形如普通 ...
- 每天五分钟Go - 数组
//数组的声明,默认为0值 var a1 [2]int fmt.Println(a1) //数组的长度 fmt.Println(len(a1)) //遍历数组 for i, v := range a1 ...
- intouch/ifix嵌入视频控件2(报警视频联动初步思路)
在项目中有朋友遇到类似的需求,ifix中嵌入视频,并实现报警与视频的联动功能.诸如,重要设备启动时,摄像头自动弹窗,并持续一段时间自动弹窗关掉:设备故障时,摄像头自动截图,录像一段时间存储:设备停止时 ...
- Qt-可编辑的ListView
新建一个QML项目, main.cpp不动如下: #include <QGuiApplication> #include <QQmlApplicationEngine> int ...