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

正文內(nèi)容

第八章線程-在線瀏覽

2024-12-27 14:09本頁面
  

【正文】 \n )。 public TestThread() { sleepTime = ( int ) ( () * 6000 )。 ( sleepTime )。 ( ().getName()+ finished )。 public class Ex8_5 { public static void main( String [] args ) { TestThread threadobj = new TestThread()。 new Thread(threadobj,Thread1).start()。 new Thread(threadobj,Thread3).start()。 } } 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_5 多線程編程基礎(chǔ) 24 class TestThread implements Runnable { private int sleepTime。 } public void run() { try { ( ().getName() + going to sleep for + sleepTime )。 } catch ( InterruptedException exception ) {}。 } } 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_5 多線程編程基礎(chǔ) 25 ? 運(yùn)行結(jié)果 Starting threads Thread1 going to sleep for 966 Thread2 going to sleep for 966 Threads started, main ends Thread3 going to sleep for 966 Thread1 finished Thread2 finished Thread3 finished ? 說明 – 因?yàn)槭怯靡粋€(gè) Runnable類型對象創(chuàng)建的 3個(gè)新線程,這三個(gè)線程就共享了這個(gè)對象的私有成員 sleepTime,在本次運(yùn)行中,三個(gè)線程都休眠了 966毫秒 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_5運(yùn)行結(jié)果 多線程編程基礎(chǔ) 26 線程間的資源共享 (續(xù) ) ? 獨(dú)立的同時(shí)運(yùn)行的線程有時(shí)需要共享一些數(shù)據(jù)并且考慮到彼此的狀態(tài)和動(dòng)作 – 例如生產(chǎn) /消費(fèi)問題:生產(chǎn)線程產(chǎn)生數(shù)據(jù)流,然后這些數(shù)據(jù)流再被消費(fèi)線程消費(fèi) – 假設(shè)一個(gè) Java應(yīng)用程序,其中有一個(gè)線程負(fù)責(zé)往文件寫數(shù)據(jù),另一個(gè)線程從同一個(gè)文件中往出都數(shù)據(jù),因?yàn)樯婕暗酵粋€(gè)資源,這里是同一個(gè)文件,這兩個(gè)線程必須保證某種方式的同步 多線程編程基礎(chǔ) 27 ? 用三個(gè)線程模擬三個(gè)售票口,總共出售 200張票 – 用 3個(gè)線程模仿 3個(gè)售票口的售票行為 – 這 3個(gè)線程應(yīng)該共享 200張票的數(shù)據(jù) public class Ex8_6{ public static void main(String[] args){ SellTickets t=new SellTickets()。 new Thread(t).start()。 } } 多線程編程基礎(chǔ) 線程間的數(shù)據(jù)共享 (續(xù) ) —— 例 8_6 28 class SellTickets implements Runnable { private int tickets=200。 } } } 線程間的數(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è)線程都會(huì)有各自的方法和變量,雖然方法是相同的,但變量卻是 各有 200張票 ,因而結(jié)果將會(huì)是各賣出 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í),不允許其他線程打斷它,否則會(huì)破壞數(shù)據(jù)的完整性。本例采用兩個(gè)線程共享同一個(gè)數(shù)據(jù)對象來實(shí)現(xiàn)對同一份數(shù)據(jù)的操作 public class Ex8_7 { public static void main(String[] args) { Tickets t=new Tickets(10)。 new Producer(t).start()。 //票號 int size。 //表示目前是否有票可售 public Tickets(int size) //構(gòu)造函數(shù),傳入總票數(shù)參數(shù) { =size。 public Producer(Tickets t) { =t。 =true。 int i=0。 } public void run() { while(i) { if(==true amp。 i=) (Consumer buys ticket +(++i))。 } } } 多線程的同步控制 (續(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. ? 通過讓兩個(gè)線程操縱同一個(gè)票類對象,實(shí)現(xiàn)了數(shù)據(jù)共享的目的 多線程的同步控制 (續(xù) ) —— 例 8_7運(yùn)行結(jié)果 多線程編程基礎(chǔ) 36 ? 設(shè)想一下,假如售票線程運(yùn)行到 =false之前, CPU切換到存票線程,存票線程將 available置為 true,并直到整個(gè)存票線程結(jié)束。此時(shí)售票號小于存票數(shù),且存票線程已經(jīng)結(jié)束不再能將 置為 true,則售票線程陷入了死循環(huán) ? 如果我們在 =false之前加上 sleep語句,讓售票線程多停留一會(huì),則可以更加清楚地看到這個(gè)問題 if(i==) { try{ (1)。 =false。即售票線程執(zhí)行時(shí)不進(jìn)入存票線程、存票線程執(zhí)行時(shí)不進(jìn)入售票線程 ? Java 使用的同步機(jī)制是監(jiān)視器 – 每個(gè)對象都只有一個(gè)“鎖旗標(biāo)”與之相連,利用多線程對其的爭奪可實(shí)現(xiàn)線程間的互斥操作 – 當(dāng)線程 A獲得了一個(gè)對象的鎖旗標(biāo)后,線程 B必須等待線程 A完成規(guī)定的操作、并釋放出鎖旗標(biāo)后,才能獲得該對象的鎖旗標(biāo),并執(zhí)行線程 B中的操作 多線程的同步控制 (續(xù) ) —— 解決例 8_7的問題 多線程編程基礎(chǔ) 39 ? 線程同步的概念,包括互斥和協(xié)作 – 互斥:許多線程在同一個(gè)共享數(shù)據(jù)上操作而互不干擾,同一時(shí)刻只能有一個(gè)線程訪問該共享數(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)的交互。 public Producer(Tickets t) { =t。 =true。 } } 多線程的同步控制 (續(xù) ) —— synchronized關(guān)鍵字 多線程編程基礎(chǔ) 42 class Consumer extends Thread { Tickets t=null。 public Consumer(Tickets t) { =t。amp。 if(i==) { try{(1)。 } } //釋放對象 t的鎖旗標(biāo) } (Consumer ends)。如果得不到,那么線程就被放到一個(gè)與該對象鎖旗標(biāo)相對應(yīng)的等待線程池中。將互斥方法放在共享的資源類 Tickets中 class Tickets { int size。 //存票序號 int i=0。 //是否有待售的票 public Tickets(int size) { =size。 available=true。amp。 if(i==number) available=false。在例 8_8中,正是因?yàn)?put和 sell兩個(gè)同步方法都屬于同一個(gè) Tickets類的對象,所以實(shí)現(xiàn)了同步 – 由于要實(shí)現(xiàn)多線程的數(shù)據(jù)共享,即多個(gè)線程對同一數(shù)據(jù)資源進(jìn)行操作,就可能造成一個(gè)線程對資源進(jìn)行了部分處理,另一個(gè)線程就插進(jìn)來對其進(jìn)行處理,這樣就會(huì)破壞共享數(shù)據(jù)的完整性。數(shù)據(jù)共享 和 線程互斥 操作經(jīng)常是密不可分 的 多線程的同步控制 (續(xù) ) ——
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1