多線程按順序執行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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM