java學習回顧---生產者與消費者問題以及多執行緒補充

Aka Faker發表於2020-12-09

生產者和消費者問題

在這裡插入圖片描述
Lock與unlock用於取代同步。在使用的時候需要創立物件,unlock往往放在finally裡面。
Await()與signal()和signalAll用於取代wait()和notify()與notifyAll(),使用的時候同樣需要創立物件。Await()往往放在try裡面。
區別在於一個lock裡面可以有多個conditional(用於操控await等)從而對不同功能執行緒進行等待和喚醒操作,避免了同步塊裡不能指定喚醒執行緒的弊端。
使用示例:
在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
消費者與生產者類似,只是把try內改為res.out();

讓執行緒結束或從wait(),sleep()中恢復執行的方法:在這裡插入圖片描述

使用方法:x.interrupt(x是想要恢復執行的執行緒),若想要讓執行緒結束,則在catch語句裡放入改變標記的語句(wait常放在try裡面,interrupt打斷wait後程式會進入catch裡),從而使標記改變,迴圈結束,run()執行結束則執行緒結束。

守護執行緒

守護執行緒(使用者執行緒)即後臺的執行緒,依託於前臺執行緒存在。當一個程式中只有守護執行緒的時候,虛擬機器就自動關閉。如果想把一個執行緒設定為守護執行緒,必須要在啟動執行緒之前設定。使用方法:x.setDaemon(true),x為希望設定的執行緒名稱。當一個程式執行緒全是迴圈的執行緒且需求迴圈次數一樣,可以把這些執行緒全都設定為守護執行緒,然後主執行緒決定迴圈次數,當主執行緒執行完迴圈次數之後,主執行緒自己關閉,此時程式裡剩下的執行緒全都是守護執行緒,然後程式就會關閉。

join()

Join()作用是使主執行緒等待某執行緒結束之後才能繼續執行。如:x.join()可以使執行此程式碼的執行緒凍結直到x執行緒結束之後主執行緒才會執行。Join()對其他建立的執行緒無效。
比如x1.start();
X2.start();x1.join();
執行這三行程式碼之後,會有三個執行緒,即主執行緒,x1,x2。主執行緒會凍結,此時虛擬機器只會執行x1和x2兩個執行緒,直到x1執行緒結束之後,主執行緒恢復執行,如果此時在x1結束之前x2就已經結束了的話,那此時執行的執行緒只有主執行緒。如果在x1結束時x2還沒結束,那此時執行的執行緒有主執行緒和x2。
Join():當A執行緒執行到了B執行緒的join()方法時,等B執行緒全部執行完,A才會執行。
Join()可以用來臨時加入執行緒執行。

執行緒的優先順序

執行緒的執行優先順序有1-10,10為最高,預設優先順序為5.可以通過setPriority來調。如:
t1.setPriority(10),作用是把t1執行緒的優先順序調到最高。(低優先順序的執行緒同樣會執行到,只是執行到的次數變少)

Yield

Yield可以暫停當前正在執行的執行緒,並執行其他執行緒。可以用來使兩個執行緒交替執行。用法:Thread.yield();

相關文章