java进阶(40)--wait与notify(生产者与消费者模式)
Mrwhite86 人气:0文档目录:
一、概念
二、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
加载全部内容