生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一

Thread中重要方法

void wait() 在其他线程调用此对象的notify()方法或notifyall()方法前,导致当前线程等待

void notify() 唤醒在此对象监视器上等待的单个线程后,会继续执行wait方法之后的代码

void notifyAll() 唤醒所有等待线程

void wait(long m)在毫秒结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/blocke状态

void sleep(long m)在毫秒结束之后,线程睡醒进入到Runnable/blocke状态

使用

我们自己创建线程类的子类时,不要忘了写上继承extend。再run()方法中写入线程同步的代码,在客户端调用时,直接调用start方法,默认自动调用run方法的代码。

实例

产品类

public class Product {

//属性代表该产品是否还有

boolean flag=false;

}

//生产者类

public class Producer extends Thread{

private Product pr;

//构造有参构造函数,让产品类实例的对象作为锁对象

public Producer(Product pr){

this.pr=pr;

}

@Override

public void run() {

//一直生产该商品

while (true){

//使用锁对象

synchronized (pr){

//如果该产品还存在,

if(pr.flag==true){

try {

//生产者停止生产

pr.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//否则生产者开始生产

System.out.println("生产者正在生产");

try {

//生产时间为5秒

Thread.sleep(5000);

System.out.println("请等待5秒");

} catch (InterruptedException e) {

e.printStackTrace();

}

//生产完成

pr.flag=true;

//唤醒消费者

pr.notify();

System.out.println("生产者生产完了,消费之开始使用");

}

}

}

}

//消费者类

public class Consumer extends Thread{

private Product pr;

//郑州人流医院 http://mobile.zzzzyy120.com/

public Consumer(Product pr){

this.pr=pr;

}

@Override

public void run() {

//消费者一直消费产品

while (true){

//锁对象

synchronized (pr){

//如果产品没有了

if (pr.flag==false){

try {

//则消费者进行等待

pr.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//如果产品还有,消费者使用产品

System.out.println("消费者正在使用");

//消耗完产品,改变产品属性

pr.flag=false;

//唤醒生产者,等待再次生产产品

pr.notify();

System.out.println("产品已经使用完了,生产者开始生产");

}

}

}

}

//主函数

public static void main(String[] args) {

//实例化产品

Product pr=new Product();

//实例化生产者,并运行run方法

new Producer(pr).start();

//实例化消费者,并运行run方法

new Consumer(pr).start();

}

运行结果

java线程唤醒与等待_Java线程的等待与唤醒相关推荐

  1. java set和get原理_Java线程池的实现原理和使用

    为什么用线程池 在我们进行开发的时候,为了充分利用系统资源,我们通常会进行多线程开发,实现起来非常简单,需要使用线程的时候就去创建一个线程(继承Thread类.实现Runnable接口.使用Calla ...

  2. java等待_Java学习:等待唤醒机制

    等待唤醒机制 线程的状态 NEW 至今尚未启动的线程处于这种状态 RUNNABLE 正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WAITIN ...

  3. java启动子线程过多导致卡死_java线程基础巩固---多Product多Consumer之间的通讯导致出现程序假死的原因分析...

    在上一次中已经实现一个生产者与消费者的初步模型(http://www.cnblogs.com/webor2006/p/8413286.html),但是当时只是一个生产者对应一个消费者,先贴下代码: p ...

  4. java 线程池 源码_java线程池源码分析

    我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...

  5. java睡眠后继续执行_Java线程只能有千个,而Go的Goroutine能有上百万个

    前言 哈喽,大家好,我是asong,我又来做知识分享了. 对于做过Java开发的程序员来说,或许会遇到这个问题:java.lang.OutOfMemoryError: Unable to create ...

  6. java 线程池的理解_JAVA线程池原理的理解

    线程池原理基础理解: 线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行.直到队列中的线程为空.实例代码如下: packa ...

  7. java线程池的应用_Java线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. java线程池存在时间_Java线程池基础

    目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...

  9. java线程池 的方法_JAVA线程池的实现方法

    我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题. 线程池的基本原理是,首先创建并保持一定数量的线程,当需要使 ...

最新文章

  1. ubuntu18.04.4 下 pycharm 中 链接 已有的virtualenv
  2. 给演讲增色的10种简单方法
  3. 在Oracle 11g中用看Oracle的共享内存段---------IPCS
  4. python find函数实现原理_非常干货:Python 探针实现原理
  5. 各种IE(IE6-IE10)兼容问题一行代码搞定
  6. 太沉重了:中国获全球“人道主义摄影奖”的照片!组图
  7. SpringCloud面试题及答案
  8. 软考软件设计师-软件工程基础知识
  9. VBS病毒(爱虫病毒) 源代码
  10. python编程包有什么用_一文提升你的编程能力,全面理解Python包的定义,拿走不谢...
  11. 题目95:百鸡问题:一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡。现有n元钱,想买n只鸡。问有多少种买法?(钱要用完)
  12. 基于云开发的校园社区小程序 微信小程序开发实战 课设作业
  13. 在职研究生计算机专业院校,计算机专业在职研究生报名有哪些院校可以选择?...
  14. wps 选择 高亮_WPS轻松办公—如何批量选中不同颜色的文字
  15. 留不住用户 FireFox中国市场占有率下跌8.6%
  16. pve 加大local容量_一步一步实现Proxmox (pve)环境的家庭服务器(WIN,DSM,软路由)...
  17. 项目说事——信不信反正我信了(合作开发总结之文档)
  18. Faded (Conor Maynard Cover)
  19. 图的逆拓扑排序(回路识别)
  20. 【引用】相思茉莉(原创)来自我的另一处博

热门文章

  1. %dn在c语言中是什么意思,请问C语言中 char far 是什么意思?
  2. docker php 一键部署_Java开发提升十倍生产力:Idea远程一键部署springboot到Docker
  3. 视图插入数据_用EXCEL作数据分析--招聘信息
  4. python paramiko invoke_shell_Python,paramiko,invoke_shell和丑陋的字符
  5. opencv画图_c++
  6. leetcode hot100(第一部分) + python(c++)
  7. 吴恩达作业5:正则化和dropout
  8. 近代数字信号处理实验-DFT分析信号的频谱
  9. 用 Python 和 werobot 框架开发公众号
  10. [设计模式] ------ 代理模式