第十三章 多執行緒 第三講

2021-06-01 12:43:32 字數 3147 閱讀 2457

第十三章  多執行緒   第三講

五  執行緒排程的方法詳解

sleep()方法是使當前執行緒睡眠指定的毫秒數,執行緒由進行狀態進入不可執行狀態,當指定的毫秒數過去後,如果有正在進行的執行緒,則進入就緒狀態,如果沒有正在進行的執行緒,則繼續執行。釋放cpu的執行權,不釋放鎖

yield()方法是使當前的執行緒暫停,將cpu資源讓出來,執行其它的執行緒執行,此時,暫停的執行緒仍處於可執行的狀態,不是阻塞狀態,如果暫停後,沒有要用的執行緒,則該執行緒繼續執行。

join()方法是當前執行緒阻塞,將cpu資源讓出來,然後加入其它的執行緒,等加入的執行緒執行完了,再執行當前的執行緒。

interrupt()方法只是為執行緒設定乙個中斷標記,並沒有中斷執行緒的執行。乙個執行緒在被設定了中斷標記之後仍可執行,isalie()返回的 是true。例項方法interrupted()測試執行緒的中斷標記,並不清除中斷標記,而靜態的interrupted()方法會測試當前執行的執行緒是否被中斷,並且在肯定的情況下,清除當前執行緒物件的中斷標記並返回。

wait()方法是在程式進行中,如果用到synchronized,則是死鎖,要解鎖,要用到此方法,可以解除此鎖,可使其它執行緒執行。但是並沒有喚醒,要喚醒要用notify()方法。

釋放cpu的執行權,釋放鎖

notify()喚醒呼叫wait()方法後被阻塞的執行緒。每次執行該方法只能喚醒乙個執行緒。

notifyall():喚醒所有呼叫wait()方法被阻塞的執行緒,這裡的所有是由執行緒管理器決定的。

注:sleep()和wait()方法都是在釋放資源,可是sleep()是不釋放鎖,wait()釋放鎖。

六  執行緒同步通訊

生產者和消費者的問題是典型的多執行緒在遇到下標來不及改變時出現的異常,如果出現了此情況,可以用synchronized方法來鎖定方法。使代 碼該執行的執行完了在往下執行。在鎖定之後,執行中,還可能會出現死鎖的狀態,解鎖要用到wrie()方法和notify()方法,開釋放鎖定的資源,並 喚醒它。

在程式執行中,可能會出現一下方法,此時b為寫入資料,a為取出資料:

(1)執行緒b寫一次,執行緒a讀一次

(3)在某個時候執行緒a執行速度比較快,它讀完一次資料之後,執行緒b還沒來得及寫,執行緒又來讀第二次。結果執行緒a讀不到資料,導致執行出錯。所以用到了一下方法:

private intindex=0;//棧頂的位置

private chardata=newchar[6];把壓入的資料存放在陣列裡

public synchronized charpop()catch(interruptedexception e)

}  

this.notify();//喚醒,使程式進行

index--;//取出後,棧頂的位置減1

system.out.println("custom:"+data[index]);

returndata[index];

}(4)執行緒b正在寫資料時,執行緒a也來讀取資料,這時可能執行緒b還沒將資料寫完,執行緒a將資料讀走,導致程式出錯。

//此方法是壓入,想向堆疊中壓入資料,資料型別是char型別的

public synchronized voidpush(charch)catch(interruptedexception e)

}this.notify();

data[index]=ch;

index++;//壓入資料之後,棧頂位置加1

system.out.println("produced:"+ch);

}例項:

要用到4個類

此類是測試類

public classsynctest

}生產者的類,壓入資料

classproducerimplementsrunnable

@override

public voidrun()catch(interruptedexception e) }}

}消費者的類,讀出資料

classconsumerimplementsrunnable

@override

public voidrun()catch(interruptedexception e) }}

}臨界資源的類,對壓入和輸出的呼叫

public classsyncstackcatch(interruptedexception e)

}this.notify();

data[index]=ch;

index++;

system.out.println("produced:"+ch);

}public synchronized charpop()catch(interruptedexception e)

}  

this.notify();

index--;

system.out.println("custom:"+data[index]);

returndata[index]

}鎖的注意事項:

執行緒中鎖定的不是方法,也不是物件,而是對臨界資源的鎖定

第十三章 多執行緒 第二講

二 執行緒的生命週期 執行緒是乙個動態執行的過程,它也有乙個從產生到死亡的過程,這就是所謂的生命週期。生命週期的執行過程 新建 就緒 執行 死亡 1 生命週期的舉例與分析 1 新建 new thread 當建立thread類的乙個例項 物件 時,此執行緒進入新建狀態 未被啟動 例如 thread t...

技術部落格 第十三章 多執行緒

技術部落格 第十三章多執行緒 併發 1 巨集觀上 併發和並行相似,多工 2 微觀上 乙個cpu在做一件事,並沒有實現並行,單任務 並行 在os中 程序 資源分配的最小單位,執行緒 cpu排程的最小單位 執行緒是程序的一部分!多執行緒的實現 1 繼承thread方法 本身就是實現runable介面的類...

第三講 執行緒和執行緒池

1.執行緒的建立 繼承thread類,或者實現runnable介面。2.執行緒的狀態轉換 建立 可執行 執行 阻塞 等待 1 從建立到可執行,呼叫run 2 從可執行到執行,呼叫該執行緒 3 執行到等待,呼叫wait 並釋放鎖,需要notiy 或者notifyall 喚醒 4 執行到阻塞,呼叫sle...