多執行緒系列之執行緒通訊(生產者和消費者案例)

2021-10-05 05:21:42 字數 2569 閱讀 4732

1,一般用object的wait/notify/notifyall,讓執行緒等待和喚醒實現執行緒之間的通訊,而且上述方法只能由同步監聽物件(共享資源)來呼叫,否則會報illegalmonitorstateexception異常。

2,還可以通過reentranlock,使用condition的await/signal來喚醒和使執行緒等待。

生產者和消費者案例

下面以廚師做菜和服務員上菜,給取餐臺(多執行緒操作的資源)放菜,上菜為例,用**實現。

1,取餐臺,多執行緒操作的資源,資源操作的同步使用synchronized方法和reentrantlock兩種方式實現。

/**

* 取餐臺,多執行緒操作的資源

*/public class foodtable

num++; // 廚師做菜,取餐臺菜品加1

system.out.println("廚師正在做菜,做菜好忙,累死。。。");

this.notify(); // 做好菜喚醒服務員執行緒上菜

} catch (interruptedexception e)

}/**

* 上菜,用synchronized修飾,同一時刻只能有乙個執行緒操作該資源物件

* @return

*/public synchronized void deliver()

num--; // 服務員做菜,取餐臺菜品減1

system.out.println("服務員正在上菜,簡簡單單上個菜,好爽。。。");

this.notify(); // 上完菜喚醒廚師執行緒上菜

} catch (interruptedexception e)

}/**

* 做菜,使用reentrantlock顯式保證同步,同一時刻只能有乙個執行緒操作該資源物件

* @return

*/public synchronized void cooklock()

num++; // 廚師做菜,取餐臺菜品加1

system.out.println("廚師正在做菜,做菜好忙,累死。。。");

condition.signal(); // 做好菜喚醒服務員執行緒上菜

} catch (interruptedexception e) finally

}/**

* 上菜,使用reentrantlock顯式保證同步,同一時刻只能有乙個執行緒操作該資源物件

* @return

*/public void deliverlock()

num--; // 服務員做菜,取餐臺菜品減1

system.out.println("服務員正在上菜,簡簡單單上個菜,好爽。。。");

condition.signal(); // 上完菜喚醒廚師執行緒上菜

} catch (interruptedexception e) finally

}}

2,廚師執行緒

/**

* 廚師,生產者,做菜

*/public class chef implements runnable

@override

public void run()

}}

3,服務員執行緒

/**

* 服務員,消費者,上菜

*/public class waiter implements runnable

@override

public void run()

}}

4,測試還是用餐館來吧qaq

/**

* 餐館,廚師和服務員協調工作

* 假設只有乙個廚師和乙個服務員,廚師做好菜放到取餐臺,廚師等待並喚醒服務員上菜,

* 服務員上菜,此時取餐臺菜品為零,等待並喚醒廚師做菜,以此往復協調工作

*/public class restaurant

}

5,簡單看下輸出

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

廚師正在做菜,做菜好忙,累死。。。

服務員正在上菜,簡簡單單上個菜,好爽。。。

NSCondition 多執行緒解決生產者消費者問題

import viewcontroller.h inte ce viewcontroller 資料緩衝區 property strong,nonatomic nsmutablearray products 執行緒鎖 property strong,nonatomic nscondition cond...

多執行緒系列之生產者和消費者

在之前接觸過pv操作的,應該對於生產者和消費者的情況有乙個了解,這裡學到多執行緒同步的時候,最恰當的乙個例子。pv操作就不多做解釋。生產者和消費者 author bobo public class producerconsumer 產品 窩頭 class wotou public string to...

執行緒間通訊 生產者與消費者(多執行緒)

從單執行緒變成多執行緒,想著本來程式裡的判斷語句是 if,而if只判斷一次,想著換成while flag 結果會出現生產乙個商品,消費兩個,或者生產兩個消費乙個的情況,後來才發現把程式中的 notify 全部變成notifyall 就解決了這個問題。public class producercons...