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

正文內(nèi)容

第八章線程(編輯修改稿)

2024-11-29 14:09 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 票,和原意就不符了 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_6運(yùn)行結(jié)果 多線程編程基礎(chǔ) 30 多線程的同步控制 ? 有時(shí)線程之間彼此不獨(dú)立、需要同步 – 線程間的互斥 ? 同時(shí)運(yùn)行的幾個(gè)線程需要共享一個(gè)(些)數(shù)據(jù) ? 一個(gè)線程對(duì)共享的數(shù)據(jù)進(jìn)行操作時(shí),不允許其他線程打斷它,否則會(huì)破壞數(shù)據(jù)的完整性。即被多個(gè)線程共享的數(shù)據(jù),在某一時(shí)刻只允許一個(gè)線程對(duì)其進(jìn)行操作 – “生產(chǎn)者 /消費(fèi)者” 問(wèn)題 ? 生產(chǎn)者產(chǎn)生數(shù)據(jù),消費(fèi)者消費(fèi)數(shù)據(jù),具體來(lái)說(shuō),假設(shè)有一個(gè) Java應(yīng)用程序,其中有一個(gè)線程負(fù)責(zé)往數(shù)據(jù)區(qū)寫數(shù)據(jù),另一個(gè)線程從同一數(shù)據(jù)區(qū)中讀數(shù)據(jù),兩個(gè)線程可以并行執(zhí)行(類似于流水線上的兩道工序) ? 如果數(shù)據(jù)區(qū)已滿,生產(chǎn)者要等消費(fèi)者取走一些數(shù)據(jù)后才能再放;而當(dāng)數(shù)據(jù)區(qū)沒(méi)有數(shù)據(jù)時(shí),消費(fèi)者要等生產(chǎn)者放入一些數(shù)據(jù)后再取 多線程編程基礎(chǔ) 31 ? 用兩個(gè)線程模擬存票、售票過(guò)程 – 假定開始售票處并沒(méi)有票,一個(gè)線程往里存票,另外一個(gè)線程則往出賣票 – 我們新建一個(gè)票類對(duì)象,讓存票和售票線程都訪問(wèn)它。本例采用兩個(gè)線程共享同一個(gè)數(shù)據(jù)對(duì)象來(lái)實(shí)現(xiàn)對(duì)同一份數(shù)據(jù)的操作 public class Ex8_7 { public static void main(String[] args) { Tickets t=new Tickets(10)。 new Consumer(t).start()。 new Producer(t).start()。 } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 32 class Tickets { int number=0。 //票號(hào) int size。 //總票數(shù) boolean available=false。 //表示目前是否有票可售 public Tickets(int size) //構(gòu)造函數(shù),傳入總票數(shù)參數(shù) { =size。 } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 33 class Producer extends Thread { Tickets t=null。 public Producer(Tickets t) { =t。 } public void run() { while( ) { (Producer puts ticket +(++))。 =true。 } } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 34 class Consumer extends Thread //售票線程 { Tickets t=null。 int i=0。 public Consumer(Tickets t) { =t。 } public void run() { while(i) { if(==true amp。amp。 i=) (Consumer buys ticket +(++i))。 if(i==) =false。 } } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 35 ? 運(yùn)行結(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 Consumer buys ticket 9 Consumer buys ticket 10. ? 通過(guò)讓兩個(gè)線程操縱同一個(gè)票類對(duì)象,實(shí)現(xiàn)了數(shù)據(jù)共享的目的 多線程的同步控制 (續(xù) ) —— 例 8_7運(yùn)行結(jié)果 多線程編程基礎(chǔ) 36 ? 設(shè)想一下,假如售票線程運(yùn)行到 =false之前, CPU切換到存票線程,存票線程將 available置為 true,并直到整個(gè)存票線程結(jié)束。再次切換到售票線程后,售票線程執(zhí)行 =false。此時(shí)售票號(hào)小于存票數(shù),且存票線程已經(jīng)結(jié)束不再能將 置為 true,則售票線程陷入了死循環(huán) ? 如果我們?cè)?=false之前加上 sleep語(yǔ)句,讓售票線程多停留一會(huì),則可以更加清楚地看到這個(gè)問(wèn)題 if(i==) { try{ (1)。 } catch ( InterruptedException exception ) {}。 =false。 } 多線程的同步控制 (續(xù) ) —— 例 8_7修改 多線程編程基礎(chǔ) 37 ? 修改后運(yùn)行結(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修改后運(yùn)行結(jié)果 多線程編程基礎(chǔ) 38 ? 如何避免上面這種意外,讓我們的程序是“線程安全”的呢? – 解決線程的同步 /互斥問(wèn)題 – 存票線程和售票線程應(yīng)保持互斥關(guān)系。即售票線程執(zhí)行時(shí)不進(jìn)入存票線程、存票線程執(zhí)行時(shí)不進(jìn)入售票線程 ? Java 使用的同步機(jī)制是監(jiān)視器 – 每個(gè)對(duì)象都只有一個(gè)“鎖旗標(biāo)”與之相連,利用多線程對(duì)其的爭(zhēng)奪可實(shí)現(xiàn)線程間的互斥操作 – 當(dāng)線程 A獲得了一個(gè)對(duì)象的鎖旗標(biāo)后,線程 B必須等待線程 A完成規(guī)定的操作、并釋放出鎖旗標(biāo)后,才能獲得該對(duì)象的鎖旗標(biāo),并執(zhí)行線程 B中的操作 多線程的同步控制 (續(xù) ) —— 解決例 8_7的問(wèn)題 多線程編程基礎(chǔ) 39 ? 線程同步的概念,包括互斥和協(xié)作 – 互斥:許多線程在同一個(gè)共享數(shù)據(jù)上操作而互不干擾,同一時(shí)刻只能有一個(gè)線程訪問(wèn)該共享數(shù)據(jù)。因此有些方法或程序段在同一時(shí)刻只能被一個(gè)線程執(zhí)行,稱之為 監(jiān)視區(qū) – 協(xié)作:多個(gè)線程可以有條件地同時(shí)操作共享數(shù)據(jù)。執(zhí)行監(jiān)視區(qū)代碼的線程在條件滿足的情況下可以允許其它線程進(jìn)入 監(jiān)視區(qū) 多線程的同步控制 (續(xù) ) —— 線程同步 (Synchronization) 多線程編程基礎(chǔ) 40 ? synchronized —— 線程同步關(guān)鍵字 – 用于指定需要同步的代碼段或方法,也就是 監(jiān)視區(qū) – 可實(shí)現(xiàn)與一個(gè)鎖旗標(biāo)的交互。例如: ? synchronized(對(duì)象) { 代碼段 } – synchronized的功能是:首先判斷對(duì)象的鎖旗標(biāo)是否在,如果在就獲得鎖旗標(biāo),然后就可以執(zhí)行緊隨其后的代碼段;如果對(duì)象的鎖旗標(biāo)不在(已被其他線程拿走),就進(jìn)入等待狀態(tài),直到獲得鎖旗標(biāo) – 當(dāng)被 synchronized限定的代碼段執(zhí)行完,就釋放鎖旗標(biāo) 多線程的同步控制 (續(xù) ) —— synchronized關(guān)鍵字 多線程編程基礎(chǔ) 41 ? 將需要互斥的語(yǔ)句段放入 synchronized(object){}語(yǔ)句框中,且兩處的 object是相同的 class Producer extends Thread { Tickets t=null。 public Producer(Tickets t) { =t。} public void run() { while(()) { synchronized(t) { // 申請(qǐng)對(duì)象 t的鎖旗標(biāo) (Producer puts ticket +(++))。 =true。 } // 釋放對(duì)象 t的鎖旗標(biāo) } (Producer ends!)。 } } 多線程的同步控制 (續(xù) ) —— synchronized關(guān)鍵字 多線程編程基礎(chǔ) 42 class Consumer extends Thread { Tickets t=null。 int i=0。 public Consumer(Tickets t) { =t。 } public void run() { while(i) { synchronized(t) { //申請(qǐng)對(duì)象 t的鎖旗標(biāo) if(==true amp。amp。 i=) (Consumer buys ticket +(++i))。 if(i==) { try{(1)。}catch(Exception e){} =false。 } } //釋放對(duì)象 t的鎖旗標(biāo) } (Consumer ends)。 } } 多線程的同步控制 (續(xù) )
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1