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();
            }
        }
    }
  • 相关阅读:
    Checkpointing
    Flink1.10全文跟读翻译
    The Broadcast State Pattern
    mr原理简单分析
    Event Time
    动态规划潜入
    寻找hive数据倾斜路
    Distributed Runtime
    druid18.1版本single-server启动报错
    Programming Model
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10916174.html
Copyright © 2011-2022 走看看