1,一般用object的wait/notify/notifyall,讓執行緒等待和喚醒實現執行緒之間的通訊,而且上述方法只能由同步監聽物件(共享資源)來呼叫,否則會報illegalmonitorstateexception異常。
2,還可以通過reentranlock,使用condition的await/signal來喚醒和使執行緒等待。
生產者和消費者案例
下面以廚師做菜和服務員上菜,給取餐臺(多執行緒操作的資源)放菜,上菜為例,用**實現。
1,取餐臺,多執行緒操作的資源,資源操作的同步使用synchronized方法和reentrantlock兩種方式實現。
2,廚師執行緒/**
* 取餐臺,多執行緒操作的資源
*/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
}}
3,服務員執行緒/**
* 廚師,生產者,做菜
*/public class chef implements runnable
@override
public void run()
}}
4,測試還是用餐館來吧qaq/**
* 服務員,消費者,上菜
*/public class waiter implements runnable
@override
public void run()
}}
5,簡單看下輸出/**
* 餐館,廚師和服務員協調工作
* 假設只有乙個廚師和乙個服務員,廚師做好菜放到取餐臺,廚師等待並喚醒服務員上菜,
* 服務員上菜,此時取餐臺菜品為零,等待並喚醒廚師做菜,以此往復協調工作
*/public class restaurant
}
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
廚師正在做菜,做菜好忙,累死。。。
服務員正在上菜,簡簡單單上個菜,好爽。。。
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...