class Out {
private int i = 1;
private ReentrantLock r = new ReentrantLock();//锁对象
private Condition c1 = r.newCondition();//
private Condition c2 = r.newCondition();
private Condition c3 = r.newCondition();
public void out1() throws InterruptedException {
r.lock();
if (i != 1) {//因为是唤醒或等待指定线程,只需判断一次
c1.await();
}
Thread.sleep(1000);
System.out.println("1号线程");
i = 2;
c2.signal();
r.unlock();
}
public void out2() throws InterruptedException {
r.lock();
if (i != 2) {
c2.await();
}
Thread.sleep(1000);
System.out.println("2号线程");
i = 3;
c3.signal();
r.unlock();
}
public void out3() throws InterruptedException {
r.lock();
if (i != 3) {
c3.await();
}
Thread.sleep(1000);
System.out.println("3号线程");
i = 1;
c1.signal();
r.unlock();
}
}
class hello {
public static void main(String[] args) throws IOException, InterruptedException {
Out o = new Out();
ExecutorService pool = Executors.newFixedThreadPool(3);//新建线程池,池内能装入三个线程.
pool.submit(new Thread() {
public void run() {
for(int i = 0;i < 3 ; i++){
try {
o.out1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
pool.submit(new Thread() {
public void run() {
for(int i = 0;i < 3 ; i++) {
try {
o.out2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
pool.submit(new Thread() {
public void run() {
for(int i = 0;i < 3 ; i++){//循环打印三次
try {
o.out3();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
}
运行结果: