package com.hangzhou.springcloud.service.impl;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadPrintTest {
public static void main(String[] args) {
ThreadResource threadResource=new ThreadResource();
new Thread(()->{
for (int i=0;i<10;i++){
threadResource.printA();
}
},"A").start();
new Thread(()->{
for (int i=0;i<10;i++){
threadResource.printB();
}
},"B").start();
new Thread(()->{
for (int i=0;i<10;i++){
threadResource.printC();
}
},"C").start();
}
}
class ThreadResource{
private ReentrantLock lock=new ReentrantLock();
private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition();
private volatile int num=1;
public void printA(){
lock.lock();
//多线程不能用if 防止出现并发异常 java.util.ConcurrentModifyException
try {
while (num!=1){
conditionA.await();
}
System.out.println(Thread.currentThread().getName()+"线程打印A");
num=2;
conditionB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB(){
lock.lock();
try {
while (num!=2){
conditionB.await();
}
System.out.println(Thread.currentThread().getName()+"线程打印B");
num=3;
conditionC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC(){
lock.lock();
try {
while (num!=3){
conditionC.await();
}
System.out.println(Thread.currentThread().getName()+"线程打印C");
num=1;
conditionA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
输出结果:
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
A线程打印A
B线程打印B
C线程打印C
Process finished with exit code 0
本文介绍了一个使用Java实现的多线程打印A、B、C的案例,通过ReentrantLock和Condition确保线程间的正确执行顺序。三个线程分别打印A、B、C,每个线程在打印前会检查当前的状态变量num,如果状态变量不匹配,则线程将自己挂起并等待信号,当状态变量匹配时,线程打印相应的字符并更新状态变量,然后唤醒下一个线程。
2861

被折叠的 条评论
为什么被折叠?



