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

正文內(nèi)容

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

2025-10-07 16:19本頁面
  

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