多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。
畫圖演示
需求:第乙個執行緒寫入(input)使用者,另乙個執行緒取讀取(out)使用者.實現讀乙個,寫乙個操作。
**實現:
//共享資源
class user
//輸入執行緒
class out extends thread
@override
public void run()else
count = (count + 1) % 2;}}
}//輸出執行緒
class input extends thread
@override
public void run()
}}public class outinputthread
}
結果如下:
注意:資料發生錯亂,造成執行緒安全問題
輸入輸出執行緒上加上synchronized
class user
class out extends thread
@override
public void run()else
count = (count + 1) % 2;}}
}}class input extends thread
@override
public void run()}}
}public class outinputthread
}
class user
class out extends thread
@override
public void run() catch (interruptedexception e)
}if (count == 0)else
count = (count + 1) % 2;
//當生產者生產完時就開始等待消費者消費
user.flag = true;
//喚醒等待拿user物件的執行緒
user.notify();}}
}}class input extends thread
@override
public void run() catch (interruptedexception e)
}system.out.println(user.name+","+user.***);
user.flag = false;
//喚醒等待拿user物件的執行緒
user.notify();}}
}}public class outinputthread
}
對於sleep()方法,我們首先要知道該方法是屬於thread類中的。而wait()方法,則是屬於object類中的。
sleep()方法導致了程式暫停執行指定的時間,讓出cpu該其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。
在呼叫sleep()方法的過程中,執行緒不會釋放物件鎖。
而當呼叫wait()方法的時候,執行緒會放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫notify()方法後本執行緒才進入物件鎖定池準備
獲取物件鎖進入執行狀態。
在 jdk1.5 之後,並發包中新增了 lock 介面(以及相關實現類)用來實現鎖功能,lock 介面提供了與 synchronized 關鍵字類似的同步功能,但需要在使用時手動獲取鎖和釋放鎖
lock lock = new reentrantlock();
lock.lock();
tryfinally
lock 介面可以嘗試非阻塞地獲取鎖 當前執行緒嘗試獲取鎖。如果這一時刻鎖沒有被其他執行緒獲取到,則成功獲取並持有鎖。
lock 介面能被中斷地獲取鎖 與 synchronized 不同,獲取到鎖的執行緒能夠響應中斷,當獲取到的鎖的執行緒被中斷時,中斷異常將會被丟擲,同時鎖會被釋放。
lock 介面在指定的截止時間之前獲取鎖,如果截止時間到了依舊無法獲取鎖,則返回。
condition的功能類似於在傳統的執行緒技術中的,object.wait()和object.notify()的功能。
class userinfo
class outa extends thread
@override
public void run() catch (exception e)
}if (count == 0)else
count = (count + 1) % 2;
user.flag = true;
//喚醒執行緒 等同於 notify()
condition.signal();
}catch (exception e)finally }}
}class inputa extends thread
@override
public void run() catch (interruptedexception e)
}system.out.println(user.name+","+user.***);
user.flag = false;
//喚醒執行緒 等同於 notify()
condition.signal();
}catch (exception e)finally }}
}public class threadlock
}
多執行緒之間通訊
多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類 class res輸入執行緒資源 class intthrad extends thread overr...
多執行緒之間通訊
多執行緒之間通訊 就是多個執行緒在操作同乙個資源,但是操作的動作不同 現在需要實現,生產一台電機,銷售一台電機問題。實現 執行結果 資料發生錯亂,造成執行緒安全問題 解決執行緒安全問題 通過wait notify來解決。wait和sleep的區別 wait可以指定時間也可以不指定時間,sleep必須...
4 多執行緒之間實現通訊
目錄 知識點1 多執行緒之間如何實現通訊 1 什麼是多執行緒之間通訊?2 多執行緒之間通訊需求 3 實現基本實現 1 共享資源源實體類 2 輸入執行緒資源 3 輸出執行緒 4 執行 5 解決執行緒安全問題 知識點2 wait notify方法 知識點3 wait與sleep區別 知識點4 lock鎖...