方法1:使用boolean标记

package com.ziyear.exam;/*** 3个线程,顺序打印ABC10次*/
public class PrintThread_ABC_10_1 {/*定义标记,初始1为true;2,3为false->可以打印A,打印完设置2为true;1,3为false->可以打印B打印完设置3为true;1,2为false->可以打印C打印完设置1为true;2,3为false->可以打印A........每个线程各自循环10次*/private static boolean flag1 = true;private static boolean flag2 = false;private static boolean flag3 = false;public static void main(String[] args) {final PrintThread_ABC_10_1 o = new PrintThread_ABC_10_1();//创建一个final的本对象用来加锁Thread t1 = new Thread(() -> {for (int i = 0; i < 10; i++) {//循环10次while (true){synchronized (o){if(!flag1){//如果第一个标记为false时 等待try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}}else{System.out.println(Thread.currentThread().getName());flag1 = false;flag2 = true;flag3 = false;o.notifyAll();//唤醒所有线程break;}}}}},"A");Thread t2 = new Thread(() -> {for (int i = 0; i < 10; i++) {//循环10次while (true){synchronized (o){if(!flag2){//如果第一个标记为false时 等待try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}}else{System.out.println(Thread.currentThread().getName());flag1 = false;flag2 = false;flag3 = true;o.notifyAll();//唤醒所有线程break;}}}}},"B");Thread t3 = new Thread(() -> {for (int i = 0; i < 10; i++) {//循环10次while (true){synchronized (o){if(!flag3){//如果第一个标记为false时 等待try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}}else{System.out.println(Thread.currentThread().getName());flag1 = true;flag2 = false;flag3 = false;o.notifyAll();//唤醒所有线程break;}}}}},"C");t1.start();t2.start();t3.start();}}

方法2:使用原子操作类AtomicInteger

package com.ziyear.exam;import java.util.concurrent.atomic.AtomicInteger;/*** 3个线程,顺序打印ABC10次*/
public class PrintThread_ABC_10_2 {static AtomicInteger synObj = new AtomicInteger(0);public static void main(String[] args) {TestPrint t1 = new TestPrint(synObj,"A",0);TestPrint t2 = new TestPrint(synObj,"B",1);TestPrint t3 = new TestPrint(synObj,"C",2);t1.start();t2.start();t3.start();}
}class TestPrint extends Thread{private AtomicInteger syObj;private String name;private int flag;private  int count = 0;public TestPrint(AtomicInteger syObj, String name, int flag) {this.syObj = syObj;this.name = name;this.flag = flag;}@Overridepublic void run() {while (true) {synchronized (syObj){if (syObj.get() % 3 == flag){syObj.set(syObj.get() + 1);System.out.println(name);count++;syObj.notifyAll();if (count == 10){break;}}else{try {syObj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}

方法3:使用信号量

package com.ziyear.exam;import java.util.concurrent.Semaphore;/*** 使用信号量控制打印ABC*/
public class PrintThread_ABC_10_3 {public static void main(String[] args) {PrintABCUsingSemaphore printABC = new PrintABCUsingSemaphore();new Thread(new Runnable() {@Overridepublic void run() {printABC.printA();}}).start();new Thread(new Runnable() {@Overridepublic void run() {printABC.printB();}}).start();new Thread(new Runnable() {@Overridepublic void run() {printABC.printC();}}).start();}
}class PrintABCUsingSemaphore {/*** 第一个信号量初始化为1,其他初始化为0 3个信号量分别控制打印ABC* A有信号量,所以先打印A,打印完A后初始化第二个信号量B* B有信号量,所以打印B,打印完后初始化第三个信号量* C有信号量,所以打印C,打印完后初始化第一个信号量* ...... 每个线程各自在print方法中循环10次* */private Semaphore semaphoreA = new Semaphore(1);private Semaphore semaphoreB = new Semaphore(0);private Semaphore semaphoreC = new Semaphore(0);public void printA() {print("A", semaphoreA, semaphoreB);}public void printB() {print("B", semaphoreB, semaphoreC);}public void printC() {print("C", semaphoreC, semaphoreA);}private void print(String name, Semaphore currentSemaphore, Semaphore nextSemaphore) {for (int i = 0; i < 10; ) {try {currentSemaphore.acquire();System.out.println(name);i++;nextSemaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}
}

三个线程轮流执行顺序打印ABC相关推荐

  1. 关于线程的执行顺序,可能真的只是你以为的你以为

    摘要:今天,我们就一起来看看线程到底是如何执行的,它的顺序又是怎样的? 本文分享自华为云社区<线程的执行顺序与你想的不一样!!>,作者:冰 河 . 一.线程的执行顺序是不确定的 调用Thr ...

  2. 如何改变 Python 中线程的执行顺序

    一.主线程会等待所有的子线程结束后才结束 首先我看下最普通情况下,主线程和子线程的情况. import threading from time import sleep, ctimedef sing( ...

  3. 面试必问,如何控制多个线程的执行顺序

    面试中经常被遇到一个问题:现在有三个线程,分别执行会打印A,B,C,如何编码使得三个线程顺序执行,即输出'ABCABC',这道题看似简单,但是如果对多线程不熟悉或者没有准备还真的不好回答. 下面列举几 ...

  4. linux多线程顺序打印abc,c++11 多线程依次打印ABC

    并发 练习代码 #include #include #include #include using namespace std; std::mutex mtx; std::condition_vari ...

  5. java 主线程与子线程的执行顺序

    记录一个面试问题,多线程中需要等子线程全部执行完成后再执行主线程 网上的方式 1.sleep()方式,这种做法不靠谱,不知道cpu到底哪个线程会拿到,不能使用 2.将子线程加入集合中(最好是线程安全的 ...

  6. 三个不同线程顺序打印ABC十种写法,看到就是赚到!

    夫陶公清风千古,余又何人,敢称庶几 个人博客地址:http://www.breez.work

  7. 多线程:保证三个线程依次按顺序执行?newSingleThreadExecutor!!!

    newSingleThreadExecutor 这个线程池,保证线程里面的任务依次执行,这让我发现了新大陆, 立马实践了一下,发现不负所望: public class TestJoin {public ...

  8. 【多线程基础】- 多个线程顺序打印ABC

    题目:3个线程名字分别是A,B,C 现在在console上连续打印10次 ABC . public class Test {public static void main(String[] args) ...

  9. Jmeter笔记(5)线程组执行顺序

    未勾选测试计划---独立运行每个线程组时,线程组并行执行 勾选测试计划---独立运行每个线程组时,线程组顺序执行 不运行的线程组可选择禁用:线程组---右键---禁用 转载于:https://www. ...

最新文章

  1. OpenCV中的特征匹配+单应性以查找对象
  2. 【万级并发】电商库存扣减如何设计?不超卖!
  3. FPGA跨时钟域处理的三大方法
  4. android 6gb和8gb区别,手机6GB内存和8GB内存的差距到底有多大?你可能被忽悠了!...
  5. 如何调用java的包_jsp如何调用java包
  6. Android DEX 基础
  7. redis value最大值_Redis从入门到深入-String的value
  8. 人工智能先驱 Nils Nilsson 去世,吴恩达、Yann LeCun 悼念
  9. python通过解释器内置的open_Python 之 文件读写的学习
  10. RelativeLayout addRule踩坑之旅
  11. 给DataGridView 的单元格 赋空值
  12. 对我启发最大的数学学习方法
  13. 全球及中国焦磷酸钠行业“十四五”规划建议与创新环境分析报告2022-2028年版
  14. node--压缩文件夹
  15. 【微信小程序】---授权登陆---【巷子】
  16. python 发布文章,使用Python自动化发布文章:(一)
  17. Jetson TX2重要技巧
  18. YOLOX的解耦头结构思考
  19. 有声读物探索高速公路和英语的小路
  20. ccf-csp 2013-2015题目总结

热门文章

  1. ThinkPHP55.1验证码的使用及点击刷新
  2. sql字符串包含单引号
  3. Python3,5行代码,制作Gif动图,太简单了。
  4. ADADELTA AN ADAPTIVE LEARNING RATE METHOD
  5. python 计算两个经纬度的距离_python 通过两个点的经纬度计算距离
  6. linux中的图形化UDP调试工具
  7. Tensorflow2.0+Anaconda + Windows10+cuda10.0+python3.7+spyder安装教程
  8. 【CV】SiamFC:用于目标跟踪的全卷积孪生网络
  9. The APK file does not exist on disk
  10. 蓝筹股有哪些股票 蓝筹股有哪些股票2018