1. 程式人生 > 實用技巧 >Java併發程式設計中的等待/通知正規化

Java併發程式設計中的等待/通知正規化

“等待-通知”是挺有用的一個程式設計正規化、設計模式或者說套路。白話講就是一個執行緒執行需要等待一個事件發生或者說一個條件具備,然後另一個執行緒去觸發這個事件或者更新這個條件,那麼前者就可以觸發執行了。這種設計可以解藕兩個執行緒的業務邏輯,類似於生產者和消費者。

實現這個模式,主要有3種方法:

1、比較容易想到的“經典的方法”

一個執行緒不斷的自旋,去查詢自己能夠繼續執行的條件,一旦發現條件具備(另一個執行緒修改了條件),則結束自旋,去執行業務邏輯。

package com.wangan.concurrent;

import java.util.concurrent.TimeUnit;

public class WaitAndNotifyPattern { public static volatile boolean flag = false; public static void main(String[] args) { new Thread(new Wait()).start(); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
new Thread(new Notify()).start(); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } } } class Wait implements Runnable{ @Override public void run() { while(!WaitAndNotifyPattern.flag) {
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("條件還未滿足,睡1秒"); } System.out.println("wait條件滿足了,執行業務邏輯"); } } class Notify implements Runnable{ @Override public void run() { WaitAndNotifyPattern.flag = true; System.out.println("notify修改了條件為true"); } }

輸出:

條件還未滿足,睡1秒

條件還未滿足,睡1秒

條件還未滿足,睡1秒

條件還未滿足,睡1秒

notify修改了條件為true

條件還未滿足,睡1秒 這裡體現了發現條件不及時

wait條件滿足了,執行業務邏輯

這個方法最大的缺陷在於需要執行緒sleep,休眠多少時間是一對兒矛盾,少了的話cpu受不了,多了的話條件變了這邊發現不及時。

所以就有了下面兩個新方法。

2、使用Object監視器方法配合synchronized實現等待通知機制

3、使用Condition配合Lock實現等待通知機制