• 多线程按顺序执行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();
            }
        }
    }
  • 相关阅读:
    FluorineFx:基于RSO(远程共享对象)的文本聊天室
    第一个十年,我从教师转行为web程序员,下一个十年呢?
    AS3中的单件(Singleton)模式
    数据结构C#版笔记双向链表(DbLinkList)
    FluorineFx:认证与授权
    FluorineFx:视频录制及回放(Flash/AS3环境)
    数据结构C#版笔记顺序表(SeqList)
    puremvc框架之hello world!
    flex中使用swc实现更好的界面代码分离
    puremvc框架之Command
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10916174.html
Copyright © 2020-2023  润新知