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