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

线程的等待和唤醒

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

synchronized 解决了多线程竞争的问题: 我们可以 在 synchronized块中安全的对一个变量进行修改

 class TaskQueue{

  Queue<String> queue= new LinkedList<>();
    public synchronized void addTask(String s){
        this .queue.add(s)
    }
}

没有解决多线程协调的问题

 class TaskQueue{

 //队列
  Queue<String> queue= new LinkedList<>();

    public synchronized void addTask(String s){
        this .queue.add(s)
    }

    public synchronized String getTask(){
        
        while(queue.isEmpty()){

        }
        return queue.remove();
    }

}

多线程协调运行: 但条件不满足时,线程进入等待状态

  public synchronized String getTask(){  //1.线程1 获取锁
        
        while(queue.isEmpty()){ // 线程 1 判断条件
           this.wait();  //线程 1 进入等待状态
        }
        return queue.remove();
    }

线程协调机制: wait /notify

 class TaskQueue{

 //队列
  Queue<String> queue= new LinkedList<>();

    public synchronized void addTask(String s){
        this .queue.add(s)
        this.notify();
    }

    public synchronized String getTask(){
        
        while(queue.isEmpty()){

        }
        return queue.remove();
    }

}

wait /notiy 用于多线程协调运行:

  1. 在synchronized内部可以调用wait()是线程进入等待状态
  2. 必须在已获得的锁对象调用wait()方法
  3. 在synchronized内部可以调用notify/notiyAll()唤醒其他等待线程
  4. 必须在获得的锁对象调用notify/notifyAll()方法

转载于:https://my.oschina.net/2016jyh/blog/3011753

相关文章:

  • js中forEach回调同异步问题
  • 整行读字符串且需分割计算字符串个数
  • 比特大陆新一轮裁员50%,回应称系人员调整
  • zabbix linux系统模板更新
  • 2019.2.20 c++ 知识梳理
  • 微信全局登录设计与实现
  • 朝鲜APT集团Lazarus通过KEYMARBLE Backdoor瞄准俄罗斯组织
  • Less 日常用法
  • 手机端车牌号码键盘的vue组件
  • 回归生活:清理微信公众号
  • Cisco Nexus 系列交换机NX-OS升级
  • React开发实战
  • 工作中总结前端开发流程--vue项目
  • Java各种IO流的总结
  • MySQL-事务管理(基础)
  • ComponentOne 2017 V2版本正式发布
  • HashMap ConcurrentHashMap
  • HTTP 简介
  • HTTP中GET与POST的区别 99%的错误认识
  • Intervention/image 图片处理扩展包的安装和使用
  • Java应用性能调优
  • Meteor的表单提交:Form
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Theano - 导数
  • 从重复到重用
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 动态规划入门(以爬楼梯为例)
  • 简单基于spring的redis配置(单机和集群模式)
  • 跨域
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 入门级的git使用指北
  • 深入浏览器事件循环的本质
  • 什么是Javascript函数节流?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 一起参Ember.js讨论、问答社区。
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • Hibernate主键生成策略及选择
  • scrapy中间件源码分析及常用中间件大全
  • ​马来语翻译中文去哪比较好?
  • #传输# #传输数据判断#
  • (175)FPGA门控时钟技术
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (搬运以学习)flask 上下文的实现
  • (笔试题)合法字符串
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (篇九)MySQL常用内置函数
  • (十五)使用Nexus创建Maven私服
  • (四)图像的%2线性拉伸
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • . NET自动找可写目录
  • .NET Core IdentityServer4实战-开篇介绍与规划