这个异常我暂时还是想不明白,大概查了一下百度,调用线程的唤醒,等待等操作,必须有这个资源类的对象才能,而且还是唯一持有者,所以必须在加锁的方法里面完成调用
package CommunicactionThread03;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo01 {
public static void main(String[] args) {
Printer printer = new Printer();
new Thread(()->{
for (int i = 0; i < 5; i++) {
printer.printf5();
}
}).start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
printer.printf10();
}
}).start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
printer.printf15();
}
}).start();
}
}
class Printer{
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
Condition condition1=lock.newCondition();
Condition condition2=lock.newCondition();
int num=1;
public void printf5(){
try {
while (num!=1){
condition.await();
}
for (int i = 0; i < 5; i++) {
System.out.println("AA");
}
num=2;
condition1.signal();
}
catch (Exception e){
e.printStackTrace();
}
finally {
}
}
public void printf10(){
try {
while (num!=2){
condition1.await();
}
for (int i = 0; i < 10; i++) {
System.out.println("BB");
}
num=3;
condition2.signal();
}
catch (Exception e){
e.printStackTrace();
}
finally {
}
}
public void printf15(){
try {
while (num!=3){
condition2.await();
}
for (int i = 0; i < 15; i++) {
System.out.println("CC");
}
num=1;
condition.signal();
}
catch (Exception e){
e.printStackTrace();
}
finally {
}
}
}