一、使用wait(),notify() 注意Object的这两个方法都必须加锁
public class WaitNotifyTest {
private int flag;
public synchronized void a() {
while (flag != 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("a");
flag ++;
notifyAll();
}
public synchronized void b() {
while (flag != 1) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("b");
flag ++;
notifyAll();
}
public synchronized void c() {
while (flag != 2) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("c");
flag = 0;
notifyAll();
}
public static void main(String[] args) {
WaitNotifyTest waitNotifyTest = new WaitNotifyTest();
TestA testA = new TestA(waitNotifyTest);
TestB testB = new TestB(waitNotifyTest);
TestC testC = new TestC(waitNotifyTest);
new Thread(testA).start();
new Thread(testB).start();
new Thread(testC).start();
}
}
class TestA implements Runnable{
private WaitNotifyTest waitNotifyTest;
public TestA(WaitNotifyTest waitNotifyTest) {
this.waitNotifyTest = waitNotifyTest;
}
@Override
public void run() {
while (true) {
waitNotifyTest.a();
}
}
}
class TestB implements Runnable{
private WaitNotifyTest waitNotifyTest;
public TestB(WaitNotifyTest waitNotifyTest) {
this.waitNotifyTest = waitNotifyTest;
}
@Override
public void run() {
while (true) {
waitNotifyTest.b();
}
}
}
class TestC implements Runnable{
private WaitNotifyTest waitNotifyTest;
public TestC(WaitNotifyTest waitNotifyTest) {
this.waitNotifyTest = waitNotifyTest;
}
@Override
public void run() {
while (true) {
waitNotifyTest.c();
}
}
}
二、使用Condition (condition更加的灵活他可以选择想要叫醒的线程)
public class ConditionTest {
private int flag;
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
public void a() {
lock.lock();
while (flag != 0) {
try {
conditionA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("a");
flag ++;
conditionB.signal(); //唤醒B
lock.unlock();
}
public void b() {
lock.lock();
while (flag != 1) {
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("b");
flag ++;
conditionC.signal();
lock.unlock();
}
public void c() {
lock.lock();
while (flag != 2) {
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("c");
flag = 0;
conditionA.signal();
lock.unlock();
}
public static void main(String[] args) {
WaitNotifyTest waitNotifyTest = new WaitNotifyTest();
TestA test1 = new TestA(waitNotifyTest);
TestB test2 = new TestB(waitNotifyTest);
TestC test3 = new TestC(waitNotifyTest);
new Thread(test1).start();
new Thread(test2).start();
new Thread(test3).start();
}
}
class Test1 implements Runnable{
private WaitNotifyTest waitNotifyTest;
public Test1(WaitNotifyTest waitNotifyTest) {
this.waitNotifyTest = waitNotifyTest;
}
@Override
public void run() {
while (true) {
waitNotifyTest.a();
}
}
}
class Test2 implements Runnable{
private WaitNotifyTest waitNotifyTest;
public Test2(WaitNotifyTest waitNotifyTest) {
this.waitNotifyTest = waitNotifyTest;
}
@Override
public void run() {
while (true) {
waitNotifyTest.b();
}
}
}
class Test3 implements Runnable{
private WaitNotifyTest waitNotifyTest;
public Test3(WaitNotifyTest waitNotifyTest) {
this.waitNotifyTest = waitNotifyTest;
}
@Override
public void run() {
while (true) {
waitNotifyTest.c();
}
}
}