版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35241080/article/details/82530913
一、线程通信,交替执行
编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
*如:ABCABCABC…… 依次递归
使用锁加上condition来实现
congdition接口下的基本方法
await() //进入等待
await(long, TimeUnit)//等待时间
awaitNanos(long)
awaitUninterruptibly()
awaitUntil(Date)
signal() //信号,唤醒线程-与notify类似
signalAll() //唤醒所有线程
二、demo
三个线程则每个线程调用一个方法,每个方法交替通知该谁执行了,例如A打印完通知B开始,B打印完通知C开始,C打印完通知A,以此类推
public class ConditionDemo {
public static void main(String[] args) {
final ConditionTest ad = new ConditionTest();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
ad.loopA(i);
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
ad.loopB(i);
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
ad.loopC(i);
System.out.println("-----------------------------------");
}
}
}, "C").start();
}
}
class ConditionTest {
private int number=1;
private Lock lock = new ReentrantLock();
private java.util.concurrent.locks.Condition cd1 = lock.newCondition();
private java.util.concurrent.locks.Condition cd2 = lock.newCondition();
private java.util.concurrent.locks.Condition cd3 = lock.newCondition();
public void loopA(int loop){
lock.lock();
try{
if(number !=1){
cd1.await();
}
for(int i =0;i < 1;i++){
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + loop);
}
number=2;
cd2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally{
lock.unlock();
}
}
public void loopB(int loop){
lock.lock();
try{
if(number !=2){
cd2.await();
}
for(int i =0;i < 1;i++){
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + loop);
}
number=3;
cd3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally{
lock.unlock();
}
}
public void loopC(int loop){
lock.lock();
try{
if(number !=3){
cd3.await();
}
for(int i =0;i < 1;i++){
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + loop);
}
number=1;
cd1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally{
lock.unlock();
}
}
}
来源于尚硅谷官网JUC视频