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