当前位置: 首页 > news >正文

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();
    }
}

 

转载于:https://www.cnblogs.com/zhuawang/p/3758024.html

相关文章:

  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • 忘记scott密码解决
  • 采集/自动登录啊都可以用这两个方法实现 asp.net
  • windows phone随笔
  • [CLR via C#]11. 事件
  • Welcome to Swift (苹果官方Swift文档初译与注解九)---58~62页(第二章)
  • 高级mask应用
  • 义隆单片机学习笔记之(四) 编程及烧录
  • ASP.NET MD5加密
  • topcoder SRM 618 DIV2 MovingRooksDiv2
  • 微信公众号自定义菜单与回车
  • 协议分析-迅雷镜象服务器下载
  • 一个硬件高手的设计经验分享
  • log4j 将日志记录到数据库
  • 如何用笔记本组建家庭点歌系统
  • ----------
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • golang中接口赋值与方法集
  • HashMap ConcurrentHashMap
  • JavaScript新鲜事·第5期
  • java小心机(3)| 浅析finalize()
  • js递归,无限分级树形折叠菜单
  • maven工程打包jar以及java jar命令的classpath使用
  • Mysql优化
  • Spring框架之我见(三)——IOC、AOP
  • tensorflow学习笔记3——MNIST应用篇
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分享一份非常强势的Android面试题
  • 力扣(LeetCode)357
  • 免费小说阅读小程序
  • 前端之Sass/Scss实战笔记
  • 删除表内多余的重复数据
  • 小试R空间处理新库sf
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)模仿学习-Action数据的模仿
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET建议使用的大小写命名原则
  • .net开发时的诡异问题,button的onclick事件无效
  • @Bean注解详解
  • @RequestBody与@ModelAttribute
  • @RequestMapping用法详解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [LeetCode] 19. 删除链表的倒数第 N 个结点
  • [LeetCode]-Spiral Matrix III 螺旋矩阵