import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
// A:1、B:2、C:3
private int number = 1;
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void test1() {
lock.lock();
try {
while(number != 1) {
c1.wait();
}
for(int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + "work" + i);
}
// 通知
number = 2;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void test2() {
lock.lock();
try {
while(number != 2) {
c2.wait();
}
for(int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + "work" + i);
}
// 通知
number = 3;
c3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void test3() {
lock.lock();
try {
while(number != 3) {
c3.wait();
}
for(int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + "work" + i);
}
// 通知
number = 1;
c1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Test test = new Test();
new Thread(new Runnable() {
@Override
public void run() {
test.test1();
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
test.test2();
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
test.test3();
}
}, "C").start();
}
}
ReentrantLock精确唤醒
最新推荐文章于 2024-08-09 21:40:02 发布