java线程唤醒与等待_Java线程的等待与唤醒
生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一
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线程的等待与唤醒相关推荐
- java set和get原理_Java线程池的实现原理和使用
为什么用线程池 在我们进行开发的时候,为了充分利用系统资源,我们通常会进行多线程开发,实现起来非常简单,需要使用线程的时候就去创建一个线程(继承Thread类.实现Runnable接口.使用Calla ...
- java等待_Java学习:等待唤醒机制
等待唤醒机制 线程的状态 NEW 至今尚未启动的线程处于这种状态 RUNNABLE 正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WAITIN ...
- java启动子线程过多导致卡死_java线程基础巩固---多Product多Consumer之间的通讯导致出现程序假死的原因分析...
在上一次中已经实现一个生产者与消费者的初步模型(http://www.cnblogs.com/webor2006/p/8413286.html),但是当时只是一个生产者对应一个消费者,先贴下代码: p ...
- java 线程池 源码_java线程池源码分析
我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...
- java睡眠后继续执行_Java线程只能有千个,而Go的Goroutine能有上百万个
前言 哈喽,大家好,我是asong,我又来做知识分享了. 对于做过Java开发的程序员来说,或许会遇到这个问题:java.lang.OutOfMemoryError: Unable to create ...
- java 线程池的理解_JAVA线程池原理的理解
线程池原理基础理解: 线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行.直到队列中的线程为空.实例代码如下: packa ...
- java线程池的应用_Java线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- java线程池存在时间_Java线程池基础
目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...
- java线程池 的方法_JAVA线程池的实现方法
我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题. 线程池的基本原理是,首先创建并保持一定数量的线程,当需要使 ...
最新文章
- ubuntu18.04.4 下 pycharm 中 链接 已有的virtualenv
- 给演讲增色的10种简单方法
- 在Oracle 11g中用看Oracle的共享内存段---------IPCS
- python find函数实现原理_非常干货:Python 探针实现原理
- 各种IE(IE6-IE10)兼容问题一行代码搞定
- 太沉重了:中国获全球“人道主义摄影奖”的照片!组图
- SpringCloud面试题及答案
- 软考软件设计师-软件工程基础知识
- VBS病毒(爱虫病毒) 源代码
- python编程包有什么用_一文提升你的编程能力,全面理解Python包的定义,拿走不谢...
- 题目95:百鸡问题:一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡。现有n元钱,想买n只鸡。问有多少种买法?(钱要用完)
- 基于云开发的校园社区小程序 微信小程序开发实战 课设作业
- 在职研究生计算机专业院校,计算机专业在职研究生报名有哪些院校可以选择?...
- wps 选择 高亮_WPS轻松办公—如何批量选中不同颜色的文字
- 留不住用户 FireFox中国市场占有率下跌8.6%
- pve 加大local容量_一步一步实现Proxmox (pve)环境的家庭服务器(WIN,DSM,软路由)...
- 项目说事——信不信反正我信了(合作开发总结之文档)
- Faded (Conor Maynard Cover)
- 图的逆拓扑排序(回路识别)
- 【引用】相思茉莉(原创)来自我的另一处博
热门文章
- %dn在c语言中是什么意思,请问C语言中 char far 是什么意思?
- docker php 一键部署_Java开发提升十倍生产力:Idea远程一键部署springboot到Docker
- 视图插入数据_用EXCEL作数据分析--招聘信息
- python paramiko invoke_shell_Python,paramiko,invoke_shell和丑陋的字符
- opencv画图_c++
- leetcode hot100(第一部分) + python(c++)
- 吴恩达作业5:正则化和dropout
- 近代数字信号处理实验-DFT分析信号的频谱
- 用 Python 和 werobot 框架开发公众号
- [设计模式] ------ 代理模式