生產者消費者 簡單示例

2021-09-01 03:18:38 字數 2073 閱讀 6477

class meal

public string tostring()

}class waitperson implements runnable

public void run()

system.out.println("waitperson got " + restaurant.meal);

synchronized (restaurant.chef)

}} catch (exception e) }}

class chef implements runnable

public void run()

if(++count == 10)

system.out.println("order up! ");

synchronized(restaurant.waitperson)

timeunit.milliseconds.sleep(100);

}} catch (interruptedexception e) }}

public class restaurant

public static void main(string args)

}

restaurant是waitperson和chef的焦點, 他們都必須子回到在為哪個restaurant工作,

因為他們必須和這家飯店的「餐窗」打交道, 以便放置或拿取restaurant.meal。 在run()

中, wiatperson進入wait()模式, 停止其任務, 直到被chef的notifyall()喚醒。

由於這是乙個非常簡單的程式,因此我們直到只有乙個任務將在waitperson的鎖上

等待,即waitperson任務自身。 出於這個原因, 理論上可以呼叫notify()而不是

notifyall()。 但是,在更複雜的情況下,可能會有多個任務在某個特定物件上

等待,因此就不知道哪個任務應該被喚醒,因此,呼叫notifyall()更安全些,

這樣可以喚醒等待這個鎖的所有任務, 而每個任務都必須決定這個通知是否與

自己相關。

注意, wait()被包裝在乙個while()語句中, 這個語句在不斷地測試正在等待的食物。

看上去有點怪-- 如果在等待乙個訂單,一旦被喚醒,這個訂單就必須是可獲得的,對嘛?

正如前面注意到的, 問題是在併發應用中, 某個洽談的任務可能會在waitperson被喚醒,

會突然插足拿走訂單,唯一安全的方式是使用下面這種wait()的慣用法

while(conditionisnotmet)

wait();

對notifyall()的呼叫必須首先捕獲waitperson上的鎖, 而在watiperson.run()中

的對wati()的呼叫會自動地釋放這個鎖, 因此這是有可能實現的。 因為呼叫

notifyall()必然擁有這個鎖, 所以這保證兩個試圖在統一個物件上呼叫notifyall()

的任務不會相互衝突。

通過把整個run()方法體放到乙個try語句塊中, 可使得這2個run()方法都被設計為

可以有序地關閉。 catch自居將緊挨著run()方法的結束括號之前結束,因此,如果這個任務

收到了interruptedexception異常, 它將在捕獲異常之後立即結束。

注意, 在chef中, 在呼叫shutdownnow()之後, 應該直接從run()中返回,並且通常這就是

你應該做的。 但是,以這種方式執行還有一些更有趣的東西。 shutdownnow()將向所有

由executorservice啟動的任務傳送interrupt(), 但是在chef中,任務並沒有獲得該

interrupt()之後立即關閉, 因為當任務試圖進入乙個(可中斷的)阻塞操作時,這個

中斷只能丟擲interruptedexception。 因此, 將看到首先顯示了 "order up!",然後

當chef試圖呼叫slee()時, 丟擲了interruptedexception. 如果移除對slee()的呼叫,

那麼這個任務將回到run()迴圈的頂部,並由於thread.interrupted()測試而退出,

同時並不丟擲異常。

生產者消費者示例01

編寫程式,要求子執行緒迴圈10次,接著主線程迴圈100次,接著又回到子執行緒迴圈10次,接著再回到主線程迴圈100次,如此迴圈50次 public class test02 class serviceobject catch interruptedexception e for int i 1 i ...

生產者消費者步驟示例

生產者消費者 示例synchronized 執行緒之間通訊 生產者消費者問題 四個步驟 判斷,等待,業務,通知 public class acatch interruptedexception e a start new thread catch interruptedexception e b s...

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...