多线程按顺序执行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();
        }
    }
}

 

posted @ 2019-05-24 09:38  谋知  阅读(2105)  评论(0编辑  收藏  举报