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

正文內容

第八章線程(專業(yè)版)

2025-12-24 14:09上一頁面

下一頁面
  

【正文】 if ((tick % 50000) == 0) { //每隔 5000進行顯示 (Thread + num + , tick = + tick)。這個算法基于線程的優(yōu)先級對其進行調度 66 ? 線程的優(yōu)先級 – 每個 Java線程都有一個優(yōu)先級,其范圍都在 1和10之間。 public Consumer(Tickets t) { =t。在例 8_8中,正是因為 put和 sell兩個同步方法都屬于同一個 Tickets類的對象,所以實現了同步 – 由于要實現多線程的數據共享,即多個線程對同一數據資源進行操作,就可能造成一個線程對資源進行了部分處理,另一個線程就插進來對其進行處理,這樣就會破壞共享數據的完整性。 } } //釋放對象 t的鎖旗標 } (Consumer ends)。即售票線程執(zhí)行時不進入存票線程、存票線程執(zhí)行時不進入售票線程 ? Java 使用的同步機制是監(jiān)視器 – 每個對象都只有一個“鎖旗標”與之相連,利用多線程對其的爭奪可實現線程間的互斥操作 – 當線程 A獲得了一個對象的鎖旗標后,線程 B必須等待線程 A完成規(guī)定的操作、并釋放出鎖旗標后,才能獲得該對象的鎖旗標,并執(zhí)行線程 B中的操作 多線程的同步控制 (續(xù) ) —— 解決例 8_7的問題 多線程編程基礎 39 ? 線程同步的概念,包括互斥和協作 – 互斥:許多線程在同一個共享數據上操作而互不干擾,同一時刻只能有一個線程訪問該共享數據。 public Producer(Tickets t) { =t。 } } 線程間的數據共享 (續(xù) ) —— 例 8_5 多線程編程基礎 25 ? 運行結果 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 ? 說明 – 因為是用一個 Runnable類型對象創(chuàng)建的 3個新線程,這三個線程就共享了這個對象的私有成員 sleepTime,在本次運行中,三個線程都休眠了 966毫秒 線程間的數據共享 (續(xù) ) —— 例 8_5運行結果 多線程編程基礎 26 線程間的資源共享 (續(xù) ) ? 獨立的同時運行的線程有時需要共享一些數據并且考慮到彼此的狀態(tài)和動作 – 例如生產 /消費問題:生產線程產生數據流,然后這些數據流再被消費線程消費 – 假設一個 Java應用程序,其中有一個線程負責往文件寫數據,另一個線程從同一個文件中往出都數據,因為涉及到同一個資源,這里是同一個文件,這兩個線程必須保證某種方式的同步 多線程編程基礎 27 ? 用三個線程模擬三個售票口,總共出售 200張票 – 用 3個線程模仿 3個售票口的售票行為 – 這 3個線程應該共享 200張票的數據 public class Ex8_6{ public static void main(String[] args){ SellTickets t=new SellTickets()。 ( sleepTime )。 int result=1。 // 啟動線程 1 ()。 while(i0) { result=result*i。這個子類的對象需要調用 start方法來啟動,新線程將自動進入 run方法。 } catch(Exception e){}。 sleepTime = ( int ) ( () * 6000 )。 } } Runnable接口 (續(xù) ) —— 例 8_3 多線程編程基礎 20 ? 使用 Runnable接口實現例 8_2功能 public class Ex8_4{ public static void main( String [] args ) { TestThread thread1 = new TestThread()。 ( Starting threads )。 public void run() { while(tickets0) { ( ().getName() + is selling ticket +tickets)。 public Consumer(Tickets t) { =t。} public void run() { while(()) { synchronized(t) { // 申請對象 t的鎖旗標 (Producer puts ticket +(++))。 //票總數 int number=0。 available=true。 } } class ThreadTest extends Thread { public void run() { while(true){} } } ? 運行程序,則發(fā)現整個程序在主線程結束時就隨之中止運行了,如果注釋掉 (true)語句,則程序永遠不會結束 后臺線程 (續(xù) ) —— 例 8_10 多線程編程基礎 54 線程的生命周期 ? 線程的生命周期 – 線程從產生到消亡的過程 – 一個線程在任何時刻都處于某種線程狀態(tài)( thread state) 55 線程的幾種基本狀態(tài) ? 線程生命周期狀態(tài)圖 線程調度 ru n () 完成 時間到 s y n c h ro n iz e d未獲得鎖旗標 n o tif y () w a it() s le e p () 獲得鎖旗標 s ta rt() 就緒狀態(tài) 新線程 阻塞 ( 休眠 ) 阻塞 ( 進入對象 lo c k 池 ) 運行狀態(tài) 阻塞 ( 進入對象 w a it 池 ) 死亡狀態(tài) 線程的生命周期 56 ? 誕生狀態(tài) – 線程剛剛被創(chuàng)建 ? 就緒狀態(tài) – 線程的 start 方法已被執(zhí)行 – 線程已準備好運行 ? 運行狀態(tài) – 處理機分配給了線程,線程正在運行 ? 阻塞狀態(tài)( Blocked) – 在線程發(fā)出輸入 /輸出請求且必須等待其返回 – 遇到用 synchronized標記的方法而未獲得其監(jiān)視器暫時不能進入執(zhí)行時 ? 休眠狀態(tài)( Sleeping) – 執(zhí)行 sleep方法而進入休眠 ? 死亡狀態(tài) – 線程已完成或退出 線程的幾種基本狀態(tài) (續(xù) ) 線程的生命周期 57 死鎖問題 ? 死鎖 – 線程在運行過程中,其中某個步驟往往需要滿足一些條件才能繼續(xù)進行下去,如果這個條件不能滿足,線程將在這個步驟上出現阻塞 – 線程 A可能會陷于對線程 B的等待,而線程 B同樣陷于對線程 C的等待,依次類推,整個等待鏈最后又可能回到線程 A。 i 2。 yield()。 i++) runners[i].start()。 //調用 stopme方法結束 t線程 } } 控制線程的生命 (續(xù) ) —— 例 8_12 線程的生命周期 64 class TestThread extends Thread{ private boolean flag=true。 //售票后喚醒存票線程開始存票 if (number==size) number=size+1 。 } public synchronized void sell() { //同步方法,實現售票的功能 if(available==true amp。 } public void run() { while(i) { synchronized(t) { //申請對象 t的鎖旗標 if(==true amp。再次切換到售票線程后,售票線程執(zhí)行 =false。 } } 多線程的同步控制 (續(xù) ) —— 例 8_7 多線程編程基礎 32 class Tickets { int number=0。 public TestThread() { sleepTime = ( int ) ( () * 6000 )。 new Thread(thread3,Thread3).start()。 new Thread(t).start()。這個方法必須在 start()方法前使用 public final void checkAccess() 判斷當前線程是否有權力修改調用此方法的線程 public void setName(String name) 更該本線程的名稱為指定參數 public final boolean isAlive() 測試線程是否處于活動狀態(tài),如果線程被啟動并且沒有死亡則返回 true Thread類 (續(xù) ) —— 常用 API函數 多線程編程基礎 14 ? 創(chuàng)建 3個新線程,每個線程睡眠一段時間( 0~ 6秒),然后結束 public class Ex8_2 { public static void main( String [] args ) { //創(chuàng)建并命名每個線程 TestThread thread1 = new TestThread( thread1 )。 } } class FactorialThread extends Thread { private int num。 (main thread ends )。 public void interrupt() 打斷此線程 public final void join() 在當前線程中加入調用 join方法的線程 A,直到線程 A死亡才能繼續(xù)執(zhí)行當前線程 public final void join(long millis) 在當
點擊復制文檔內容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1