zoukankan      html  css  js  c++  java
  • 多线程按顺序执行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();
            }
        }
    }
  • 相关阅读:
    洛谷 P1991 无线通讯网/一本通OJ 1487【例 2】北极通讯网络
    [NOIP2016TG] 洛谷 P1850 换教室
    洛谷 P1169 [ZJOI2007]棋盘制作
    C#中数组、ArrayList和List三者的区别
    【转载】C#读写注册表
    UninstallTool(Windows软件卸载工具)--快捷、方便卸载电脑中的软件
    C#启动一个外部程序-CreateProcess
    C# 调用外部程序Process类
    学习C#,每天一话
    C#中字符串处理(随时更新)
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10916174.html
Copyright © 2011-2022 走看看