AI智能
改变未来

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » java进阶(40)–wait与notify(生产者与消费者模式)