使用Lock交替实现输出20遍A、B、C
package com.scc.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class AlterNative {
private Lock lock = new ReentrantLock();
// 创建三个对象 要为特定 Lock 实例获得 Condition 实例,请使用其 newCondition() 方法。
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition();
private int count = 1;
private int num = 1;
public void outputA() {
lock.lock();
try {
if (num != 1) {
try {
conditionA.await();//A等待 造成当前线程在接到信号或被中断之前一直处于等待状态。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("A");
conditionB.signal();//唤醒B 唤醒一个等待线程。
num = 2;//重新赋值
} finally {
lock.unlock();//A解锁 把资源给其他人使用
}
}
public void outputB() {
lock.lock();
try {
if (num != 2) {
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("B");
conditionC.signal();
num = 3;
} finally {
lock.unlock();
}
}
public void outputC() {
lock.lock();
try {
if (num != 3) {
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("C");
System.out.println("循环到了:"+count+"次了");
count++;
conditionA.signal();
num = 1;
} finally {
lock.unlock();
}
}
}
package com.scc.thread;
public class Demo5 {
public static void main(String[] args) {
AlterNative a=new AlterNative();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
a.outputA();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
a.outputB();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
a.outputC();
}
}
}).start();
}
}
运行结果:
A
B
C
循环到了:1次了
A
B
C
循环到了:2次了
A
B
C
循环到了:3次了
A
B
C
循环到了:4次了
A
B
C
循环到了:5次了
A
B
C
循环到了:6次了
A
B
C
循环到了:7次了
A
B
C
循环到了:8次了
A
B
C
循环到了:9次了
A
B
C
循环到了:10次了
A
B
C
循环到了:11次了
A
B
C
循环到了:12次了
A
B
C
循环到了:13次了
A
B
C
循环到了:14次了
A
B
C
循环到了:15次了
A
B
C
循环到了:16次了
A
B
C
循环到了:17次了
A
B
C
循环到了:18次了
A
B
C
循环到了:19次了
A
B
C
循环到了:20次了