编写一个程序,开启 3 个线程,这三个线程的 ID 分别为A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归?

package com.company;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /*
* 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
* 如:ABCABCABC…… 依次递归
*/
public class TestABCAlternate { public static void main(String[] args) {
AlternateDemo ad = new AlternateDemo(); new Thread(() -> { for (int i = 1; i <= 10; i++) {
ad.loopA(i);
} }, "A").start(); new Thread(() -> { for (int i = 1; i <= 10; i++) {
ad.loopB(i);
} }, "B").start(); new Thread(() -> { for (int i = 1; i <= 10; i++) {
ad.loopC(i); } }, "C").start();
} } class AlternateDemo { private int number = 1; //当前正在执行线程的标记 private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition(); /**
* @param totalLoop : 循环第几轮
*/
void loopA(int totalLoop) {
lock.lock(); try {
//1. 判断
if (number != 1) {
condition1.await();
} //2. 打印
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
} //3. 唤醒
number = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} void loopB(int totalLoop) {
lock.lock(); try {
//1. 判断
if (number != 2) {
condition2.await();
} //2. 打印
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
} //3. 唤醒
number = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} void loopC(int totalLoop) {
lock.lock(); try {
//1. 判断
if (number != 3) {
condition3.await();
} //2. 打印
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}
System.out.println("------------------");
//3. 唤醒
number = 1;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} }

上面有一部分使用java1.8新特性写的,看下结果:

A    1    1
B 1 1
C 1 1
------------------
A 1 2
B 1 2
C 1 2
------------------
A 1 3
B 1 3
C 1 3
------------------
A 1 4
B 1 4
C 1 4
------------------
A 1 5
B 1 5
C 1 5
------------------
A 1 6
B 1 6
C 1 6
------------------
A 1 7
B 1 7
C 1 7
------------------
A 1 8
B 1 8
C 1 8
------------------
A 1 9
B 1 9
C 1 9
------------------
A 1 10
B 1 10
C 1 10
------------------

最新文章

  1. 设计模式(十一):从文Finder中认识&quot;组合模式&quot;(Composite Pattern)
  2. 从tabBarController的一个item上的控制器跳转到另一个item上的控制器
  3. cocos2dx day 1
  4. FPGA的典型应用领域
  5. mac android studio 编译时报Class JavaLaunchHelper is implemented in both
  6. Jquery AJax Post 返回值问题
  7. 网络编程学习笔记(三)UDP
  8. 二级缓存:EHCache的使用
  9. Git Push:error: Couldn't set refs/remotes/origin/master;error: update_ref failed for ref 'refs/remot
  10. 2019年年初iOS招人心得笔记(附面试题)
  11. [总结]高效的jQuery代码编写技巧
  12. django rest framework 项目创建
  13. 反向找related_name以及limit_fields_to
  14. css清除浮动clearfix:after的用法详解
  15. android kernel控制台初始化过程
  16. ubuntu apt-get方式安装与卸载
  17. 怎样修改织梦网站的favicon图标
  18. 首层nginx 传递 二级代理,三级代理......多级代理nginx 客户端真实IP的方法
  19. .NET中异常类(Exception)
  20. Java8系列之重新认识HashMap(转)

热门文章

  1. Netty源码分析第4章(pipeline)----&gt;第3节: handler的删除
  2. dom学习要点
  3. ceilometer 源码分析(polling)(O版)
  4. Erlang运行时中的无锁队列及其在异步线程中的应用
  5. JVM调优(2)
  6. “Hello World!”团队第六周的第三次会议
  7. 面向对象OO第5-7次作业总结
  8. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周
  9. Answer the questions(回答自己的问题)
  10. STL的集合set