文档目录:
一、概念
二、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;23 import java.util.ArrayList;4 import java.util.List;56 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 @Override27 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 //唤醒消费者422857list.notify();43 }44 }4546 }47 }48 class Consumer implements Runnable{49 //创建仓库50 private List list;51 public Consumer(List list)52 {53 this.list=list;54 }55 @Override56 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 }7374 }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