freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第八章線程(文件)

2024-11-17 14:09 上一頁面

下一頁面
 

【正文】 ,在某一時刻只允許一個線程對其進行操作 – “生產(chǎn)者 /消費者” 問題 ? 生產(chǎn)者產(chǎn)生數(shù)據(jù),消費者消費數(shù)據(jù),具體來說,假設(shè)有一個 Java應(yīng)用程序,其中有一個線程負責往數(shù)據(jù)區(qū)寫數(shù)據(jù),另一個線程從同一數(shù)據(jù)區(qū)中讀數(shù)據(jù),兩個線程可以并行執(zhí)行(類似于流水線上的兩道工序) ? 如果數(shù)據(jù)區(qū)已滿,生產(chǎn)者要等消費者取走一些數(shù)據(jù)后才能再放;而當數(shù)據(jù)區(qū)沒有數(shù)據(jù)時,消費者要等生產(chǎn)者放入一些數(shù)據(jù)后再取 多線程編程基礎(chǔ) 31 ? 用兩個線程模擬存票、售票過程 – 假定開始售票處并沒有票,一個線程往里存票,另外一個線程則往出賣票 – 我們新建一個票類對象,讓存票和售票線程都訪問它。 } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 32 class Tickets { int number=0。 } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 33 class Producer extends Thread { Tickets t=null。 } } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 34 class Consumer extends Thread //售票線程 { Tickets t=null。amp。再次切換到售票線程后,售票線程執(zhí)行 =false。 } 多線程的同步控制 (續(xù) ) —— 例 8_7修改 多線程編程基礎(chǔ) 37 ? 修改后運行結(jié)果 Producer puts ticket 1 Producer puts ticket 2 Producer puts ticket 3 Producer puts ticket 4 Producer puts ticket 5 Producer puts ticket 6 Producer puts ticket 7 Producer puts ticket 8 Consumer buys ticket 1 Consumer buys ticket 2 Consumer buys ticket 3 Consumer buys ticket 4 Consumer buys ticket 5 Consumer buys ticket 6 Consumer buys ticket 7 Consumer buys ticket 8 Producer puts ticket 9 Producer puts ticket 10 多線程的同步控制 (續(xù) ) —— 例 8_7修改后運行結(jié)果 多線程編程基礎(chǔ) 38 ? 如何避免上面這種意外,讓我們的程序是“線程安全”的呢? – 解決線程的同步 /互斥問題 – 存票線程和售票線程應(yīng)保持互斥關(guān)系。例如: ? synchronized(對象) { 代碼段 } – synchronized的功能是:首先判斷對象的鎖旗標是否在,如果在就獲得鎖旗標,然后就可以執(zhí)行緊隨其后的代碼段;如果對象的鎖旗標不在(已被其他線程拿走),就進入等待狀態(tài),直到獲得鎖旗標 – 當被 synchronized限定的代碼段執(zhí)行完,就釋放鎖旗標 多線程的同步控制 (續(xù) ) —— synchronized關(guān)鍵字 多線程編程基礎(chǔ) 41 ? 將需要互斥的語句段放入 synchronized(object){}語句框中,且兩處的 object是相同的 class Producer extends Thread { Tickets t=null。 } // 釋放對象 t的鎖旗標 } (Producer ends!)。 } public void run() { while(i) { synchronized(t) { //申請對象 t的鎖旗標 if(==true amp。}catch(Exception e){} =false。直到該對象的鎖旗標被歸還,池中的等待線程才能重新去獲得鎖旗標,然后繼續(xù)執(zhí)行下去 – 除了可以對指定的代碼段進行同步控制之外,還可以 定義整個方法在同步控制下執(zhí)行,只要在方法定義前加上synchronized關(guān)鍵字即可 多線程的同步控制 (續(xù) ) —— synchronized關(guān)鍵字 多線程編程基礎(chǔ) 44 ? 實現(xiàn)例 8_7功能。 //售票序號 boolean available=false。 } public synchronized void sell() { //同步方法,實現(xiàn)售票的功能 if(available==true amp。 } } 多線程的同步控制 (續(xù) ) —— 例 8_8 多線程編程基礎(chǔ) 45 ? 說明 – 同步方法使用的鎖旗標關(guān)聯(lián)對象正是方法所屬的實例對象。線程 A要一直等到其他線程在對象 x上調(diào)用 notify或notifyAll方法,才能夠在重新獲得對象 x的鎖旗標后繼續(xù)執(zhí)行(從 wait語句后繼續(xù)執(zhí)行) 多線程編程基礎(chǔ) 47 線程之間的通信 (續(xù) ) —— notify()和 notifyAll()方法 – notify() 隨機喚醒一個等待的線程,本線程繼續(xù)執(zhí)行 ? 線程被喚醒以后,還要等發(fā)出喚醒消息者釋放監(jiān)視器,這期間關(guān)鍵數(shù)據(jù)仍可能被改變 ? 被喚醒的線程開始執(zhí)行時,一定要判斷當前狀態(tài)是否適合自己運行 – notifyAll() 喚醒所有等待的線程,本線程繼續(xù)執(zhí)行 多線程編程基礎(chǔ) 48 ? 修改例 8_8,使每存入一張票,就售一張票,售出后,再存入 class Tickets { …… public synchronized void put() { if(available) //如果還有存票待售,則存票線程等待 try{ wait()。 //存票后喚醒售票線程開始售票 } public synchronized void sell() { if(!available) //如果沒有存票,則售票線程等待 try{ wait()。 //售票后喚醒存票線程開始存票 if (number==size) number=size+1 。 } } class Consumer extends Thread { Tickets t=null。 (true)。 public class Ex8_12{ public static void main(String[] args) throws IOException{ TestThread t=new TestThread()。 //調(diào)用 stopme方法結(jié)束 t線程 } } 控制線程的生命 (續(xù) ) —— 例 8_12 線程的生命周期 64 class TestThread extends Thread{ private boolean flag=true。 //如果 flag為真則一直顯示遞增整數(shù) } } } ? 運行效果為按下回車鍵后則停止顯示 控制線程的生命 (續(xù) ) —— 例 8_12 線程的生命周期 65 線程的優(yōu)先級 ? 線程調(diào)度 – 在單 CPU的系統(tǒng)中,多個線程需要共享 CPU,在任何時間點上實際只能有一個線程在運行 – 控制多個線程在同一個 CPU上以某種順序運行稱為線程調(diào)度 – Java虛擬機支持一種非常簡單的、確定的調(diào)度算法,叫做固定優(yōu)先級算法。最后的控制可以通過明智地使用 yield()函數(shù)來完成 – 我們只能基于效率的考慮來使用線程優(yōu)先級,而不能依靠線程優(yōu)先級來保證算法的正確性 線程的優(yōu)先級 (續(xù) ) 線程的優(yōu)先級 68 ? 假設(shè)某線程正在運行,則只有出現(xiàn)以下情況之一,才會使其暫停運行 – 一個具有更高優(yōu)先級的線程變?yōu)榫途w狀態(tài)( Ready); – 由于輸入 /輸出(或其他一些原因)、調(diào)用 sleep、 wait、yield方法使其發(fā)生阻塞; – 對于支持時間分片的系統(tǒng),時間片的時間期滿 線程的優(yōu)先級 (續(xù) ) 線程的優(yōu)先級 69 ? 創(chuàng)建兩個具有不同優(yōu)先級的線程,都從 1遞增到400000,每增加 50000顯示一次 public class Ex8_13{ public static void main(String[] args) { TestThread[] runners = new TestThread[2]。 runners[0].setPriority(2)。 i++) runners[i].start()。 } public void run() { while (tick 400000) { tick++。修改后的 run方法如下 public void run() { while (tick 400000) { tick++。}catch(Exception e){}。 yield()。 yield()。 private int num。 //設(shè)置第二個線程優(yōu)先級為 3 for (int i = 0。 i 2。默認情況下,每個線程的優(yōu)先級都設(shè)置為 5 – 在線程 A運行過程中創(chuàng)建的新的線程對象 B,初始狀態(tài)具有和線程 A相同的優(yōu)先級 – 如果 A是個后臺線程,則 B也是個后臺線程 – 可在線程創(chuàng)建之后的任何時候,通過 setPriority(int priority)方法改變其原來的優(yōu)先級 線程的優(yōu)先級 (續(xù) ) 線程的優(yōu)先級 67 ? 基于線程優(yōu)先級的線程調(diào)度 – 具有較高優(yōu)先級的線程比優(yōu)先級較低的線程優(yōu)先執(zhí)行 – 對具有相同優(yōu)先級的線程, Java的處理是隨機的 – 底層操作系統(tǒng)支持的優(yōu)先級可能要少于 10個,這樣會造成一些混亂。 } public void run() { int i=0。 new BufferedReader(new InputStreamReader())
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1