java進階(40)--wait與notify(生產者與消費者模式)

Mrwhite86發表於2021-04-05

文件目錄:

一、概念

二、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

 

相關文章