文檔目錄:
一、概念
二、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