zoukankan      html  css  js  c++  java
  • Java多线程之Wait()和Notify()

    1.Wait()和Notify、NotifyAll都是Object的方法

    2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成

    3.当调用Wait()方法时,当前线程进入阻塞状态,直到有另一线程调用了该对象的Notify()方法

    package Thread.Wait;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    class Car {
        private boolean waxOn = false;
    
        //上蜡
        public synchronized void waxed() {
            waxOn = true;
            notifyAll();
        }
    
        //抛光
        public synchronized void buffed() {
            waxOn = false;
            notifyAll();
        }
    
        public synchronized void waitForWaxing() throws InterruptedException {
            while (waxOn == false)
                wait();
        }
    
        public synchronized void waitForBuffing() throws InterruptedException {
            while (waxOn == true)
                wait();
        }
    }
    
    class WaxOn implements Runnable {
        private Car car;
    
        public WaxOn(Car c) {
            car = c;
        }
    
        @Override
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    System.out.println("Wax On!");
                    TimeUnit.MILLISECONDS.sleep(200);
                    car.waxed();//上完蜡  waxOn = true;notifyAll();
                    car.waitForBuffing();//等待抛光while (waxOn == true) wait();
                }
            } catch (Exception e) {
                System.out.println("Exiting via interrupt");
            }
            System.out.println("Ending Wax On task");
        }
    }
    
    class WaxOff implements Runnable {
        private Car car;
    
        public WaxOff(Car c) {
            car = c;
        }
    
        @Override
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    car.waitForWaxing();//等待上蜡   while (waxOn == false) wait();
                    System.out.println("Wax Off!");
                    TimeUnit.MILLISECONDS.sleep(200);
                    car.buffed();//已经抛光  waxOn = false;    notifyAll();
                }
            } catch (Exception e) {
                System.out.println("Exiting via interrupt");
            }
            System.out.println("Ending Wax Off task");
        }
    }
    
    public class WaxOMatic {
        public static void main(String[] args) throws Exception {
            Car car = new Car();
            ExecutorService exec = Executors.newCachedThreadPool();
            exec.execute(new WaxOff(car));
            exec.execute(new WaxOn(car));
            TimeUnit.SECONDS.sleep(5);
            exec.shutdownNow();
        }
    }
  • 相关阅读:
    mysql服务的注册,启动、停止、注销。 [delphi代码实现]
    java初始化
    git的使用
    jmeter测试
    Linux上安装Redis
    java多线程
    设计模式之装饰着模式
    IO流之字符流知识总结
    IO流之字节流知识总结
    java File类
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3758024.html
Copyright © 2011-2022 走看看