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

正文內(nèi)容

java語言程序設(shè)計基礎(chǔ)教程(中)ppt-資料下載頁

2025-10-07 16:19本頁面
  

【正文】 height=100 ? /applet ? /body ? /html ? 上面這個例子是通過每隔 1秒種就執(zhí)行線程的刷新畫面功能,顯示當前的時間;看起來的效果就是一個時鐘,每隔 1秒就變化一次。由于采用的是實現(xiàn)接口 Runnable的方式,所以該類 Clock還繼承了 Applet, Clock就可以 Applet的方式運行。 構(gòu)造線程體的兩種方法的比較: ? 1. 使用 Runnable接口 ? 1) 可以將 CPU,代碼和數(shù)據(jù)分開,形成清晰的模型 。 ? 2) 還可以從其他類繼承 。 ? 3) 保持程序風格的一致性。 ? 2. 直接繼承 Thread類 ? 1) 不能再從其他類繼承 。 ? 2) 編寫簡單,可以直接操縱線程,無需使用()。 ? 可以通過線程的方法進行基本的線程控制,下面我們熟悉一下常用的方法。 ? 1. start()方法 ? 線程調(diào)用該方法將啟動線程,從新建狀態(tài)進入就緒隊列排隊。一旦 CPU資源輪轉(zhuǎn)到它時,就脫離主線程開始自己的生命周期。 ? 2. run()方法 ? 系統(tǒng)的 Thread類中, run()方法沒有具體內(nèi)容,用戶需要在程序中重寫 run()方法來覆蓋原來的 run()方法,run()方法中定義線程對象被調(diào)度之后所執(zhí)行的操作,是系統(tǒng)自動調(diào)用而用戶不能引用的方法。當 run()方法執(zhí)行完畢,線程就變成死亡狀態(tài),在線程沒有結(jié)束run()方法之前,不要讓線程再調(diào)用 start()方法,否則將發(fā)生 IllegalThreadStateException異常,這一點在寫程序的時候需要注意。 ? 3. sleep(int millsecond)方法 ? sleep方法可以暫停一個線程的執(zhí)行,在適當?shù)臅r候再恢復其執(zhí)行。就是讓當前線程睡眠(停止執(zhí)行)若干毫秒,線程由運行中狀態(tài)進入不可運行狀態(tài),停止執(zhí)行時間到后線程進入可運行狀態(tài)。 ? 4. isAlive()方法 ? 測試線程狀態(tài)??梢酝ㄟ^ Thread 中的 isAlive()方法來獲取線程是否處于活動狀態(tài);線程由start()方法啟動后,直到其被終止之間的任何時刻,都處于 Alive狀態(tài)。線程處于新建狀態(tài)時,調(diào)用 isAlive()方法返回 false,線程進入死亡狀態(tài)后,調(diào)用 isAlive()方法返回 false。 ? 5. currentThread()方法 ? currentThread()方法是 Thread類的類方法,可以直接通過類名調(diào)用,該方法返回當前正在使用 CPU資源的線程。 ? 6. Interrupt()方法 ? interrupt()方法常用來“吵醒”休眠的線程。但線程調(diào)用 sleep方法處于休眠狀態(tài)時,一個占有 CPU資源的線程可以讓休眠的線程調(diào)用interrupt方法喚醒自己。導致休眠的線程發(fā)生InterruptedException異常,結(jié)束休眠,重新排隊等待 CPU資源。 ? 7. stop()方法 ? 通過調(diào)用線程的實例方法 stop()來終止線程。線程終止后,其生命周期結(jié)束了,即進入死亡態(tài),終止后的線程不能再被調(diào)度執(zhí)行。 ? 8. join()方法 ? 一個線程在占有 CPU資源期間,可以讓其他線程調(diào)用 join()方法和本線程聯(lián)合。當前線程等待調(diào)用該方法的線程結(jié)束后,再重新排隊等待 CPU資源,以便恢復執(zhí)行。如果當前線程準備聯(lián)合的線程已經(jīng)結(jié)束,也就是start方法體已經(jīng)執(zhí)行完,那么不會產(chǎn)生任何效果。 ? TimerThread tt=new TimerThread(100)。 ? ()。 ? … ? public void timeout(){ ? ()。 //當前線程等待線程 tt 執(zhí)行完后再繼續(xù)往下執(zhí)行 ? … } 【 例 75】 線程聯(lián)合的例子。 ? public class ep7_5 { ? public static void main(String args[]) { ? ThreadJoin a = new ThreadJoin()。 ? ()。 ? ()。 ? } ? } ? class ThreadJoin implements Runnable { ? TV tv。 ? Thread customer, tvMaker。 ? ThreadJoin() { ? customer = new Thread(this)。 ? tvMaker = new Thread(this)。 ? (顧客 )。 ? (電視制造廠 )。 ? } ? public void run() { ? if (() == customer) { ? (() + 等 + () ? + 生產(chǎn)電視 )。 ? try { ? ()。 // 線程 customer開始等待 tvMaker結(jié)束 ? } catch (InterruptedException e) { ? } ? (() + 買了一臺電視: + ? + 價錢 : + )。 ? } else if (() == tvMaker) { ? (() + 開始生產(chǎn)電視 ,請等 ...)。 ? try { ? (2021)。 ? } catch (InterruptedException e) { ? } ? tv = new TV(紅星牌 , 3288)。 ? (() + 生產(chǎn)完畢 )。 ? } ? } ? } ? class TV { ? float price。 ? String name。 ? TV(String name, float price) { ? = name。 ? = price。 ? } ? } ? Java提供一個線程調(diào)度器來監(jiān)控程序中啟動后進入就緒狀態(tài)的所有線程。線程調(diào)度器按照線程的優(yōu)先級決定應調(diào)度哪些線程來執(zhí)行。 ? 線程的優(yōu)先級用數(shù)字來表示,范圍從 1到 10,即 。一個線程的缺省優(yōu)先級是 5,即。 ? 下述方法可以對優(yōu)先級進行操作: ? int getPriority()。 ? 得到線程的優(yōu)先級。 ? void setPriority(int newPriority)。 ? 當線程被創(chuàng)建后,可通過此方法改變線程的優(yōu)先級。 ? 線程調(diào)度器按線程的優(yōu)先級高低選擇高優(yōu)先級線程(進入運行中狀態(tài))執(zhí)行,同時線程調(diào)度是搶先式調(diào)度,即如果在當前線程執(zhí)行過程中,一個更高優(yōu)先級的線程進入可運行狀態(tài),則這個線程立即被調(diào)度執(zhí)行。 ? 搶先式調(diào)度又分為:時間片方式和獨占方式。在時間片方式下,當前活動線程執(zhí)行完當前時間片后,如果有其他處于就緒狀態(tài)的相同優(yōu)先級的線程,系統(tǒng)會將執(zhí)行權(quán)交給其他就緒態(tài)的同優(yōu)先級線程;當前活動線程轉(zhuǎn)入等待執(zhí)行隊列,等待下一個時間片的調(diào)度。 ? 在獨占方式下,當前活動線程一旦獲得執(zhí)行權(quán),將一直執(zhí)行下去,直到執(zhí)行完畢或由于某種原因主動放棄 CPU,或者是有一高優(yōu)先級的線程處于就緒狀態(tài)。 ? 下面幾種情況下,當前線程會放棄 CPU: ? 1)線程調(diào)用了 yield()或 sleep()方法主動放棄; ? 2)由于當前線程進行 I/O 訪問,外存讀寫,等待用戶輸入等操作,導致線程阻塞;或者是為等候一個條件變量,以及線程調(diào)用 wait()方法; ? 3)搶先式系統(tǒng)下,由高優(yōu)先級的線程參與調(diào)度;時間片方式下,當前時間片用完,由同優(yōu)先級的線程參與調(diào)度。 ? 經(jīng)常有一些同時運行的線程需要共享數(shù)據(jù),此時就需考慮其他線程的狀態(tài)和行為,否則就不能保證程序的運行結(jié)果的正確性。 ? 下面是一個堆棧的類定義: ? class stack { ? int idx = 0。 // 堆棧指針的初始值為 0 ? char[] data = new char[6]。 // 堆棧有 6個字符的空間 ? public void push(char c) { // 壓棧操作 ? data[idx] = c。 // 數(shù)據(jù)入棧 ? idx++。 // 指針向上移動一位 ? } ? public char pop() { // 出棧操作 ? idx。 // 指針向下移動一位 ? return data[idx]。 // 數(shù)據(jù)出棧 ? } ? } ? 兩個線程 A和 B在同時使用 Stack的同一個實例對象,A正在往堆棧里 push一個數(shù)據(jù), B則要從堆棧中 pop一個數(shù)據(jù)。如果由于線程 A和 B在對 Stack對象的操作上的不完整性,會導致操作的失敗,具體過程如下所示: ? 1) 操作之前 ? data = | p | q | | | | | idx=2 ? 2) A執(zhí)行 push中的第一個語句,將 r推入堆棧; ? data = | p | q | r | | | | idx=2 ? 3) A還未執(zhí)行 idx++語句, A的執(zhí)行被 B中斷,B執(zhí)行 pop方法,返回 q; ? data = | p | q | r | | | | idx=1 ? 4〕 A繼續(xù)執(zhí)行 push的第二個語句: ? data = | p | q | r | | , | | idx=2 ? 最后的結(jié)果相當于 r沒有入棧。產(chǎn)生這種問題的原因在于對共享數(shù)據(jù)訪問的操作的不完整性。 ? 為解決操作的不完整性問題,在 Java 語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。每個對象都對應于一個可稱為“互斥鎖”的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。關(guān)鍵字synchronized 來與對象的互斥鎖聯(lián)系。當某個對象用 synchronized 修飾時,表明該對象在任一時刻只能由一個線程訪問。 ? public void push(char c) { ? synchronized (this) { // this表示 Stack的當前對象 ? data[idx] = c。 ? idx++。 ? } ? } ? public char pop() { ? synchronized (this) { // this表示 Stack的當前對象 ? idx。 ? return data[idx]。 ? } ? } ? synchronized 除了象上面講的放在對象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個方法為同步方法。 ? public synchronized void push(char c){ ? … ? } ? 如果 synchronized用在類聲明中,則表明該類中的所有方法都是 synchronized的。 ? 本小節(jié)將討論如何控制互相交互的線程之間的運行進度,即多線程之間的同步問題,下面我們將通過多線程同步的模型:生產(chǎn)者 消費者問題來說明怎樣實現(xiàn)多線程的同步。 ? 我們把系統(tǒng)中使用某類資源的線程稱為消費者,產(chǎn)生或釋放同類資源的線程稱為生產(chǎn)者。 ? 在下面的 Java的應用程序中,生產(chǎn)者線程向文件中寫數(shù)據(jù),消費者從文件中讀數(shù)據(jù),這樣,在這個程序中同時運行的兩個線程共享同一個文件資源。通過這個例子我們來了解怎樣使它們同步。 ? class SyncStack { // 同步堆棧類 ? private int index = 0。 // 堆棧指針初始值為 0 ? private char[] buffer = new char[6]。 // 堆棧有 6個字符的空間 ? public synchronized void push(char c) { // 加上互斥鎖 ? while (index == ) { // 堆棧已滿,不能壓棧 ? try { ? ()。 // 等待,直到有數(shù)據(jù)出棧 ? } catch (InterruptedException e) { ? } ? } ? ()。 // 通知其它線程把數(shù)據(jù)出棧 ? buffer[index] = c。 // 數(shù)據(jù)入棧 ? index++。 // 指針向上移動 ? } ? public synchronized char pop() { // 加上互斥鎖 ? while (index == 0) { // 堆棧無數(shù)據(jù),不能出棧 ? try { ? ()。 // 等待其它線程把數(shù)據(jù)入棧 ? } catch (InterruptedException e) { ? } ? } ? ()。 // 通知其它線程入棧 ? index。 // 指針向下移動 ? return buffer[index]。 // 數(shù)據(jù)出棧 ? } ? } ? class Producer im
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1