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

  }

  运行结果

  

原文地址:https://www.cnblogs.com/djw12333/p/12096446.html

时间: 2024-10-09 02:34:37

Java线程的等待与唤醒的相关文章

java线程的等待、通知机制【读书笔记】

代码示例: package com.baidu.nuomi.concurrent; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; /** * Created by sonofelice on 16/6/18. */ public class WaitNotify { static boolean flag = true; static Object l

java 线程的休眠和唤醒

Treead中使用wair() 和notify() /*需求: 使用双线程交替打印1,2,3,4....... eg: T11 ------->1 T22 ------->2 T11 ------->3 T22 ------->4 T11 ------->5 T22 ------->6 T11 ------->7 T22 ------->8 .................... *可以看出来这里的双线程是同步的* */ ps:我也是一个新手,有问题欢迎交

【线程系列三】线程的等待与唤醒机制

为了更高效的处理一些时间片短,任务量大的任务,我们可能会经常用到多线程.但是多线程的环境下,很容易出现线程并发问题,线程死锁就是很常见的一种并发问题.为了避免此类问题,我们会用到线程间的通信,而等待唤醒机制,就是线程间通信的一种形式. 等待唤醒机制用到的方法主要有: public final void wait() throws InterruptedException : 当前线程必须拥有此对象监视器.该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notif

线程的等待与唤醒,实现if...else里面的值交互依次输出

线程通信原理图: 资源类: package com.yonyou.sci.gateway.exec.threadnet; public class Resource { String name; String sex; // 用于表示赋值后的成员变量值有没有被输出 或 赋值成功 boolean flag = false; } 成员变量赋值类: package com.yonyou.sci.gateway.exec.threadnet; public class Input implements

java线程详解

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

Java线程详解(三)

Java线程:新特征-有返回值的线程 在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口. 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了. 下面是个很简单的例子: import jav

Java线程详解----借鉴

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

Java线程:概念与使用

Java线程大总结 原文章地址:一篇很老的专栏,但是现在看起来也感觉深受启发,知识点很多,很多线程特点我没有看,尴尬.但是还是整理了一下排版,转载一下. 操作系统中线程和进程的概念 在现代操作系统中,进程支持多线程.进程是资源管理的最小单元:线程是程序执行的最小单元. 为了实现程序的并发执行引入了进程的概念(程序段.数据段.PCB三部分).每个进程都有自己独立的一块内存空间,进程是程序的一个执行过程,进程之间可以并发执行. 线程是指进程中的一个执行流程,是CPU调度和分派的基本单位,它是比进程更

java 线程 (二) 线程池

package cn.sasa.demo2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test { public static void main(String[] args) { /** * 线程状态 * Thread.State * * NEW * 至今尚未启动 new ...() * * RUNNABLE * 正在执行 start() *