多线程按顺序执行3个方法
一、使用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(); } } }