java进阶(40)--wait与notify(生产者与消费者模式)


文档目录:

一、概念

二、wait的作用

三、notify的作用

四、生产者消费者模式

五、举例

---------------------------------------分割线:正文--------------------------------------------------------

一、概念

1、wait与notify为Object类自带,可用户任意的对象

2、wait的作用

o.wait()表示让正在o对象上的活动线程进入等待状态,无期限等待,直到被唤醒为止,释放o线程的锁

3、notify的作用

o.notify()表示让o对象上等待的线程唤醒,只通知,不释放对象的锁

 

二、生产者消费者模式

1、含义:

一个线程负责生产,一个线程负责消费,为达到生产与消费均衡

2、注意事项:

仓库是多线程共享的,仓库的对象最终调用wait与notify方法,建立在synchronized线程同步机制的基础上

 

三、举例:使用wait与notify方法实现生产者与消费者模式

 1 package com.bk.java.Test40_ProducerAndCousumer;  2 
 3 import java.util.ArrayList;  4 import java.util.List;  5 
 6 public class ThreadTest {  7     public static void main(String[] args) {  8         //创建仓库对象
 9         List list=new ArrayList(); 10         //创建线程对象:生产者与消费者
11         Thread t1=new Thread(new Producer(list)); 12         Thread t2=new Thread(new Consumer(list)); 13         t1.setName("生产者"); 14         t2.setName("消费者"); 15  t1.start(); 16  t2.start(); 17  } 18 } 19 class Producer implements Runnable{ 20     //创建仓库
21     private List list; 22     public Producer(List list) 23  { 24         this.list=list; 25  } 26  @Override 27     public void run() { 28         while (true){ 29             synchronized (list){ 30                 if(list.size()>0){ 31                     try { 32  list.wait(); 33                     } catch (InterruptedException e) { 34  e.printStackTrace(); 35  } 36  } 37                 //仓库为空,永久生产
38                 Object obj=new Object(); 39  list.add(obj); 40                 System.out.println(Thread.currentThread().getName()+"------->"+obj); 41                 //唤醒消费者
42  list.notify(); 43  } 44  } 45 
46  } 47 } 48 class Consumer implements Runnable{ 49     //创建仓库
50     private List list; 51     public Consumer(List list) 52  { 53         this.list=list; 54  } 55  @Override 56     public void run() { 57         while (true){ 58             synchronized (list){ 59                 if(list.size()==0){ 60                     //仓库空了
61                     try { 62  list.wait(); 63                     } catch (InterruptedException e) { 64  e.printStackTrace(); 65  } 66  } 67                 Object obj=list.remove(0); 68                 System.out.println(Thread.currentThread().getName()+"------->"+obj); 69                 //唤醒生产者
70  list.notify(); 71  } 72  } 73 
74  } 75 }

查看执行结果-片段:

消费者------->java.lang.Object@214bb29b 生产者------->java.lang.Object@17a03a96 消费者------->java.lang.Object@17a03a96 生产者------->java.lang.Object@767b0dec 消费者------->java.lang.Object@767b0dec 生产者------->java.lang.Object@1d8a042 消费者------->java.lang.Object@1d8a042 生产者------->java.lang.Object@7d7b1588 消费者------->java.lang.Object@7d7b1588 生产者------->java.lang.Object@6b19e43b

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM