java多线程的生产者与消费者(线程之间如何通信)
程序员文章站
2022-07-08 09:51:12
多线程生产者与消费者(线程通信)实现生产者和消费者案例(一)/**资源类*包子*/public class Resource {//定 义布尔类型的成员,标志位,指示线程该做什么//false没有,需要生产,true需 要消费boolean flag = false;int count ;//包子的计数 器}/**生产者线程,生产资源*对资源中的变量++*/public class Product implements Runnable {//创建资源对象...
多线程
生产者与消费者(线程通信)
实现生产者和消费者案例(一)
/*
*资源类
*包子
*/ public class Resource { //定 义布尔类型的成员,标志位,指示线程该做什么 //false没有,需要生产,true需 要消费 boolean flag = false; int count ;//包子的计数 器 }
/*
*生产者线程,生产资源
*对资源中的变量++
*/ public class Product implements Runnable { //创建资源对象 Resource r ; public Product( Resource r) { this.r = r; } public void run() { whiele(true){ synchronized(r) {//同步技术关键字 //对 象资源进行操作,判断变量 if(r.flag == true) { //没有被消费,不能生产,等待 try{ r.wait(); }catch( Exception ex){} } //可以生产 r . count++; System . out. println("生产了第"+r. count+"个"); //修改标志位 r. flag=true;//可以消费 //唤醒消费线程 r.notify(); } } } }
/*
*消费者线程,消费资源
*对资源中的变量输出打印
*/ .//创建资源对象 public class Customer implements Runnable{ Resource r ; public Product( Resource r) { this.r = r; } public void run( ) { while(true){ synchronized(r) {//同步技术关键字 //判断标志位 if(r.flag == false) { //需要生产,不能消费,等待 try{ r.wait(); }catch( Exception ex){} } //可以消费 System. out . println("消费了第"+r.count+"个") ; //修改标志位,已经消费,可以生产 r.flag=false; //唤醒生产线程 r.notify(); } } } }
public static void main(String[] args) { //创建资源对象 Resource r=new Resource(); //创建生产 者和消费者对象 Product p = new Product(r); Customer C = new Customer(r); Thread tθ = new Thread(p); Thread t1 = new Thread(c); t0.start(); t1. start(); }
wait() notify(),方法必须出现在同步技术中
解决异常问题,使用同步代码块
生产者线程和消费者线程,使用同一个对象锁, wait() notify()方法调用者必须是锁对象
线程的方法
Object类的方法wait(),Thread类的方法sleep()
-
问题:为什么等待唤醒的方法,定义在了Object类中,而不是Thread
。同步锁导致,任何对象都能作为锁,保证任何一个锁对象,都能调用等待与唤醒 -
wait()和sleep()方法区别
。wait()只能出现在同步中,必须是锁对象调用
。sleep()方法可以随时使用,不依赖同步
。wait()方法释放同步锁,被唤醒后,重新获取锁
。sleep()方法不释放同步锁
实现生产者和消费者案例(二)
私有修饰成员变量
/*
*资源类
*包子
*成员变量私有修饰,提供方法对外访问
*/ public class Resource { //定 义布尔类型的成员,标志位,指示线程该做什么 //false没有,需要生产,true需 要消费 private boolean flag = false; private int count ;//包子的计数 器 //提供方法,生产 public synchronized void product() { //判断变量=true,不能生产,等待 if(flag==true ) try{this . wait( );}catch( Exception ex) {ex. printStackTrace();} count++; System . out. println("生产了第"+count+"个"); //修改标志位 flag=true; //唤醒消费线程 this.notify(); } //提供方法,消费 public synchronized void customer() { if(flag==false) try{this . wait( );}catch( Exception ex) {ex. printStackTrace();} System. out . println("消费了第"+count+"个") ; //修改标志位 flag=false; //唤醒生成线程 this.notify(); } }
/*
*生产者线程,生产资源
*对资源中的变量++
*/ public class Product implements Runnable { //创建资源对象 private Resource r ; public Product( Resource r) { this.r = r; } public void run() { while(true){ r.product(); } } }
/*
*消费者线程,消费资源
*对资源中的变量输出打印
*/ .//创建资源对象 public class Customer implements Runnable{ Resource r ; public Customer ( Resource r) { this.r = r; } public void run( ) { while(true){ r.customer(); } } }
public static void main(String[] args) { //创建资源对象 Resource r=new Resource(); //创建生产 者和消费者对象 Product p = new Product(r); Customer C = new Customer(r); Thread tθ = new Thread(p); Thread t1 = new Thread(c); t0.start(); t1. start(); }
本文地址:https://blog.csdn.net/qq_45018290/article/details/107658668
推荐阅读
-
Java多线程-同步:synchronized 和线程通信:生产者消费者模式
-
java多线程的生产者与消费者(线程之间如何通信)
-
多线程:多生产者与多消费者(线程通信)、线程池
-
Java多线程之生产者-消费者模型的三种写法(Synchronized、ReentrantLock、ArrayBlockingQueue)
-
Java实现客户端与多线程服务器的通信(网络编程)
-
java TCP/IP通信与多线程,线程池的使用
-
java中的多线程的实现生产者消费者模式
-
Java多线程 - (三) 线程间的通信(协作) - 生产者/消费者模式
-
java 多线程的生产者-消费者 实现
-
多线程:多生产者与多消费者(线程通信)、线程池