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

正文內(nèi)容

第八章線程(存儲版)

2024-12-03 14:09上一頁面

下一頁面
  

【正文】 l。 //存票后喚醒售票線程開始售票 } public synchronized void sell() { if(!available) //如果沒有存票,則售票線程等待 try{ wait()。 } } 多線程的同步控制 (續(xù) ) —— 例 8_8 多線程編程基礎(chǔ) 45 ? 說明 – 同步方法使用的鎖旗標(biāo)關(guān)聯(lián)對象正是方法所屬的實(shí)例對象。 //售票序號 boolean available=false。}catch(Exception e){} =false。 } // 釋放對象 t的鎖旗標(biāo) } (Producer ends!)。 } 多線程的同步控制 (續(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 ? 如何避免上面這種意外,讓我們的程序是“線程安全”的呢? – 解決線程的同步 /互斥問題 – 存票線程和售票線程應(yīng)保持互斥關(guān)系。amp。 } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎(chǔ) 33 class Producer extends Thread { Tickets t=null。即被多個(gè)線程共享的數(shù)據(jù),在某一時(shí)刻只允許一個(gè)線程對其進(jìn)行操作 – “生產(chǎn)者 /消費(fèi)者” 問題 ? 生產(chǎn)者產(chǎn)生數(shù)據(jù),消費(fèi)者消費(fèi)數(shù)據(jù),具體來說,假設(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ū)沒有數(shù)據(jù)時(shí),消費(fèi)者要等生產(chǎn)者放入一些數(shù)據(jù)后再取 多線程編程基礎(chǔ) 31 ? 用兩個(gè)線程模擬存票、售票過程 – 假定開始售票處并沒有票,一個(gè)線程往里存票,另外一個(gè)線程則往出賣票 – 我們新建一個(gè)票類對象,讓存票和售票線程都訪問它。 ( ().getName() + finished )。 new Thread(threadobj,Thread2).start()。 } public void run() { try { ( ().getName() + going to sleep for + sleepTime )。 TestThread thread3 = new TestThread()。 } public void run() { int i=num。 ( sleepTime )。 ()。默認(rèn)名為 Threadn,n是從 0開始遞增的整數(shù) public Thread(String name) 構(gòu)造一個(gè)新的線程對象,并同時(shí)指定線程名 public static Thread currentThread() 返回當(dāng)前正在運(yùn)行的線程對象 public static void yield() 使當(dāng)前線程對象暫停,允許別的線程開始運(yùn)行 public static void sleep(long millis) 使當(dāng)前線程暫停運(yùn)行指定毫秒數(shù),但此線程并不失去已獲得的鎖旗標(biāo)。 (new thread started )。它位于 ,因而程序開頭不用 import任何包就可直接使用 多線程編程基礎(chǔ) 7 Thread類 (續(xù) ) —— 例 8_1 ? 在新線程中完成計(jì)算某個(gè)整數(shù)的階乘 public class Ex8_1 { public static void main( String [] args ) { (main thread starts)。原線程將同時(shí)繼續(xù)往下執(zhí)行 – Thread類直接繼承了 Object類,并實(shí)現(xiàn)了 Runnable接口。 int result=1。 Thread類 (續(xù) ) —— 例 8_1修改 多線程編程基礎(chǔ) 10 ? 修改后運(yùn)行結(jié)果 main thread starts new thread stared The factorial of 10 is 3628800 new thread ends main thread ends ? 運(yùn)行結(jié)果說明 – 新線程結(jié)束后 main線程才結(jié)束 Thread類 (續(xù) ) —— 例 8_1修改后運(yùn)行結(jié)果 多線程編程基礎(chǔ) 11 Thread類 (續(xù) ) —— 常用 API函數(shù) 名稱 說明 public Thread() 構(gòu)造一個(gè)新的線程對象,默認(rèn)名為 Threadn,n是從 0開始遞增的整數(shù) public Thread(Runnable target) 構(gòu)造一個(gè)新的線程對象,以一個(gè)實(shí)現(xiàn) Runnable接口的類的對象為參數(shù)。 ( Starting threads )。 } public void run() { try { ( getName() + going to sleep for + sleepTime )。 public FactorialThread( int num ) { =num。 TestThread thread2 = new TestThread()。 public TestThread() { sleepTime = ( int ) ( () * 6000 )。 new Thread(threadobj,Thread1).start()。 } catch ( InterruptedException exception ) {}。 } } } 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_6 多線程編程基礎(chǔ) 29 ? 運(yùn)行結(jié)果選最后幾行如下 Thread2 is selling ticket 6 Thread1 is selling ticket 5 Thread0 is selling ticket 4 Thread2 is selling ticket 3 Thread1 is selling ticket 2 Thread0 is selling ticket 1 ? 說明 – 在這個(gè)例子中,創(chuàng)建了 3個(gè)線程,每個(gè)線程調(diào)用的是 同一個(gè)SellTickets對象 中的 run()方法,訪問的是 同一個(gè)對象中的變量( tickets) – 如果是通過創(chuàng)建 Thread類的子類來模擬售票過程,再創(chuàng)建 3個(gè)新線程,則每個(gè)線程都會有各自的方法和變量,雖然方法是相同的,但變量卻是 各有 200張票 ,因而結(jié)果將會是各賣出 200張票,和原意就不符了 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_6運(yùn)行結(jié)果 多線程編程基礎(chǔ) 30 多線程的同步控制 ? 有時(shí)線程之間彼此不獨(dú)立、需要同步 – 線程間的互斥 ? 同時(shí)運(yùn)行的幾個(gè)線程需要共享一個(gè)(些)數(shù)據(jù) ? 一個(gè)線程對共享的數(shù)據(jù)進(jìn)行操作時(shí),不允許其他線程打斷它,否則會破壞數(shù)據(jù)的完整性。 //表示目前是否有票可售 public Tickets(int size) //構(gòu)造函數(shù),傳入總票數(shù)參數(shù) { =size。 } public void run() { while(i) { if(==true amp。 =false。 =true。 if(i==) { try{(1)。 //存票序號 int i=0。 if(i==number) available=false。 notify()。 } public void run() { while() ()。如此一來便陷入一個(gè)彼此等待的輪回中,任何線程都動彈不得,此即所謂死鎖( deadlock) – 對于死鎖問題,關(guān)鍵不在于出現(xiàn)問題后調(diào)試,而是在于預(yù)防 線程的生命周期 62 控制線程的生命 ? 結(jié)束線程的生命 – 用 stop方法可以結(jié)束線程的生命 ? 但如果一個(gè)線程正在操作共享數(shù)據(jù)段,操作過程沒有完成就用 stop結(jié)束的話,將會導(dǎo)致數(shù)據(jù)的不完整,因此并不提倡使用此方法 – 通常,可通過控制 run方法中循環(huán)條件的方式來結(jié)束一個(gè)線程 線程的生命周期 63 ? 線程不斷顯示遞增整數(shù),按下回車鍵則停止執(zhí)行 import .*。 while(flag) { (i++)。 i++) runners[i] = new TestThread(i)。 public TestThread(int i) { =i。 try{ sleep(1)。 //放棄執(zhí)行權(quán) } } } } 8. 3 線程的優(yōu)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1