JUC 线程按序打印ABCABCABC…
package thread.alternate;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程交替打印
* 三个线程依次打印自己线程的名字
* 例如ABCABCABC...
*
* @author RhymeChiang
* @date 2018/02/02
**/
public class ThreadAlternate {
/**
* 1代表第一个线程
* 2代表第二个线程
* 3代表第三个线程
*/
private int threadNo = 1;
// 创建一个同步锁
private Lock lock = new ReentrantLock();
// 代表第一个线程的通信
private Condition condition1 = lock.newCondition();
// 代表第二个线程的通信
private Condition condition2 = lock.newCondition();
// 代表第三个线程的通信
private Condition condition3 = lock.newCondition();
/**
* 打印A线程的名字
*
* @param loopNo
*/
public void loopA(int loopNo) {
lock.lock();
try {
// 如果不是第一个线程,则等待
if (threadNo != 1) {
condition1.await();
}
//如果是第一个线程则打印这个线程的名字
System.out.print(Thread.currentThread().getName());
// 唤醒第二个线程
threadNo = 2;
condition2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}public void loopB(int loopNo) {
lock.lock();
try {
// 如果不是第一个线程,则等待
if (threadNo != 2) {
condition2.await();
}
//如果是第一个线程则打印这个线程的名字
System.out.print(Thread.currentThread().getName());
// 唤醒第二个线程
threadNo = 3;
condition3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}public void loopC(int loopNo) {
lock.lock();
try {
// 如果不是第一个线程,则等待
if (threadNo != 3) {
condition3.await();
}
//如果是第一个线程则打印这个线程的名字
System.out.print(Thread.currentThread().getName());
// 唤醒第二个线程
threadNo = 1;
condition1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}public static void main(String[] args) {ThreadAlternate alternate = new ThreadAlternate();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;
i < 10;
i++) {
alternate.loopA(i);
}
}
},"A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;
i < 10;
i++) {
alternate.loopB(i);
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;
i < 10;
i++) {
alternate.loopC(i);
}
}
},"C").start();
}
}
【Java|Rhyme/JUC 线程按序打印ABCABCABC...】测试结果:
文章图片
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)