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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM