亲宝软件园·资讯

展开

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

 

加载全部内容

相关教程
猜你喜欢
用户评论