Java 語(yǔ)言案例教程第6章_第1頁(yè)
Java 語(yǔ)言案例教程第6章_第2頁(yè)
Java 語(yǔ)言案例教程第6章_第3頁(yè)
Java 語(yǔ)言案例教程第6章_第4頁(yè)
Java 語(yǔ)言案例教程第6章_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

主編楊培添幻燈制作楊培添等中等職業(yè)學(xué)校電子信息類(lèi)教材(計(jì)算機(jī)技術(shù)專(zhuān)業(yè))《Java語(yǔ)言案例教程》電子教案最簡(jiǎn)單的多線(xiàn)程程序是創(chuàng)建兩個(gè)線(xiàn)程,其中一個(gè)用來(lái)處理前臺(tái)的某些事件,另一個(gè)用來(lái)進(jìn)行后臺(tái)計(jì)算,而這兩個(gè)線(xiàn)程如何調(diào)度執(zhí)行完全由系統(tǒng)來(lái)實(shí)現(xiàn)。在單處理器的計(jì)算機(jī)上,這兩個(gè)線(xiàn)程實(shí)際上不能同時(shí)執(zhí)行,但系統(tǒng)可以在一個(gè)固定時(shí)間段內(nèi)或其中一個(gè)線(xiàn)程在等待某個(gè)事件時(shí),一個(gè)線(xiàn)程可以切換到另一個(gè)線(xiàn)程,這種切換是由系統(tǒng)在極短的時(shí)間內(nèi)完成的,所以造成是并發(fā)執(zhí)行的假象。

學(xué)習(xí)目標(biāo)通過(guò)本課題的學(xué)習(xí),掌握創(chuàng)建線(xiàn)程的兩種方法。

第6章多線(xiàn)程編程技術(shù)6.1線(xiàn)程的創(chuàng)建

前一頁(yè)后一頁(yè)退出這是一個(gè)簡(jiǎn)單的多線(xiàn)程程序,其功能是用兩個(gè)線(xiàn)程在屏幕上同時(shí)打印輸出相應(yīng)字符。案例30通過(guò)雙線(xiàn)程在屏幕上輸出字符圖6-1

SimpleThread.java程序運(yùn)行結(jié)果

前一頁(yè)后一頁(yè)退出

Java.lang包中的Thread類(lèi)是

Java多線(xiàn)程程序設(shè)計(jì)的基礎(chǔ),線(xiàn)程的行為由線(xiàn)程體決定,Java的線(xiàn)程體是由線(xiàn)程類(lèi)的run()方法定義的。運(yùn)行系統(tǒng)通過(guò)調(diào)用run()方法實(shí)現(xiàn)線(xiàn)程的具體行為??梢杂袃煞N途徑提供run()方法的實(shí)現(xiàn):知識(shí)鏈接前一頁(yè)后一頁(yè)退出一、通過(guò)繼承Thread類(lèi),并在子類(lèi)中重寫(xiě)繼承的run()方法,然后創(chuàng)建該子類(lèi)的對(duì)象創(chuàng)建線(xiàn)程,最后啟動(dòng)該線(xiàn)程。publicclassSimpleThreadextendsThread{

publicvoidrun(){//線(xiàn)程體,線(xiàn)程啟動(dòng)后會(huì)自動(dòng)執(zhí)行。我們可在此編寫(xiě)自已的代碼。

}

}前一頁(yè)后一頁(yè)退出通過(guò)這種方法定義線(xiàn)程體后,用類(lèi)似于下面的代碼段中的方法創(chuàng)建并啟動(dòng)線(xiàn)程:

SimpleThread

simpleThread=newSimpleThread();

simpleThread.start();當(dāng)然,我們也可以采用如本案例中直接創(chuàng)建并啟動(dòng)線(xiàn)程的方法:

newSimpleThread().start;二、通過(guò)在類(lèi)中實(shí)現(xiàn)Runnable接口,并在該類(lèi)中提供run()方法的實(shí)現(xiàn)。

classSimpleRunnableimplementsRunnable{publicvoidrun(){//線(xiàn)程體,線(xiàn)程啟動(dòng)后會(huì)自動(dòng)執(zhí)行。我們可在此編寫(xiě)自已的代碼。

}定義線(xiàn)程體后,用類(lèi)似于下面的代碼段中的方法創(chuàng)建并啟動(dòng)線(xiàn)程:SimpleRunnable

simpleRunnable=newSimpleRunnable();

Threadt=newThread(simpleRunnable);

t.start();//啟動(dòng)線(xiàn)程上機(jī)實(shí)戰(zhàn)上機(jī)完成UseThread.java程序,該程序是采用繼承Thread類(lèi)的方法實(shí)現(xiàn)的一個(gè)多線(xiàn)程程序。圖6-2

UseThread.java程序運(yùn)行結(jié)果

前一頁(yè)后一頁(yè)退出在本案例中,我們學(xué)習(xí)了線(xiàn)程的創(chuàng)建以及多線(xiàn)程程序的基本概念。線(xiàn)程創(chuàng)建的兩種方法各有特點(diǎn),兩者均很簡(jiǎn)單,采用實(shí)現(xiàn)Runnable接口的方法相對(duì)而言較靈活、實(shí)用,但直接繼承Thread類(lèi)的方法則更符合線(xiàn)程的觀(guān)念,更容易理解

習(xí)題6.11.簡(jiǎn)答題

1.什么是線(xiàn)程?多線(xiàn)程間是否共享代碼?

2.“線(xiàn)程的切換是一種運(yùn)行狀態(tài)的切換”,這種說(shuō)法對(duì)嗎?為什么?

3.如何創(chuàng)建線(xiàn)程?實(shí)現(xiàn)線(xiàn)程的兩種方法分別是什么?案例總結(jié)前一頁(yè)后一頁(yè)退出2.操作題試編寫(xiě)一個(gè)電子時(shí)鐘小應(yīng)用程序(applet)。要求在屏幕上實(shí)時(shí)顯示統(tǒng)當(dāng)前時(shí)間,且每隔一秒鐘刷新一次。

在多線(xiàn)程程序中,多個(gè)線(xiàn)程之間共用同一段程序代碼,卻具有不同的運(yùn)行狀態(tài)。多個(gè)線(xiàn)程“并發(fā)”運(yùn)行(并不一定是嚴(yán)格的同時(shí)運(yùn)行),每一個(gè)線(xiàn)程分別運(yùn)行到了哪一條語(yǔ)句、每個(gè)線(xiàn)程到底何時(shí)運(yùn)行是無(wú)法控制的,因?yàn)檫@一切都是由線(xiàn)程調(diào)度器全權(quán)負(fù)責(zé)。但是我們卻能夠通過(guò)控制線(xiàn)程運(yùn)行的狀態(tài),間接地控制線(xiàn)程的運(yùn)行,這就是所謂的線(xiàn)程調(diào)度。

學(xué)習(xí)目標(biāo)通過(guò)本課題的學(xué)習(xí),掌握線(xiàn)程各種狀態(tài)的概念并能根據(jù)需要對(duì)線(xiàn)程進(jìn)行簡(jiǎn)單的調(diào)度控制。

6.2線(xiàn)程的狀態(tài)及調(diào)度

前一頁(yè)后一頁(yè)退出本案例程序代碼實(shí)現(xiàn)了對(duì)線(xiàn)程進(jìn)行簡(jiǎn)單調(diào)度和控制的功能。案例31設(shè)置并輸出線(xiàn)程名及優(yōu)先級(jí)前一頁(yè)后一頁(yè)退出圖6-3

ControlThread.java程序運(yùn)行結(jié)果

線(xiàn)程的狀態(tài)和線(xiàn)程狀態(tài)的切換原理如圖圖6-4所示:

前一頁(yè)后一頁(yè)退出stop新生可執(zhí)行阻塞死亡new

stopstartyieldsuspend,sleep,waitresume,notifyStop,run正常退出圖6-4線(xiàn)程狀態(tài)轉(zhuǎn)換圖

知識(shí)鏈接上機(jī)完成ControlSimpleThread.java程序,該程序能控制不同的線(xiàn)程按指定的順序執(zhí)行。上機(jī)實(shí)戰(zhàn)前一頁(yè)后一頁(yè)退出圖6-5ControlSimpleThread.java程序運(yùn)行結(jié)果

本課題首先介紹線(xiàn)程的狀態(tài),然后介紹線(xiàn)程的各種狀態(tài)之間如何進(jìn)行切換,并介紹線(xiàn)程的優(yōu)先級(jí)對(duì)線(xiàn)程調(diào)度的影響,最后通過(guò)代碼的學(xué)習(xí)我們能夠明白線(xiàn)程調(diào)度具體是如何實(shí)現(xiàn)的。值得注意的是,在本案例中介紹的一些調(diào)度方法在最新版的JSDK中已經(jīng)被聲明為過(guò)時(shí),被聲明為過(guò)時(shí)的調(diào)度方法有:stop()、suspend()和resume()。使用過(guò)時(shí)的調(diào)度方法,在編譯時(shí)編譯器會(huì)給出提示,因?yàn)檫@些方法已被證明很容易造成線(xiàn)程死鎖,所以我們應(yīng)盡量少用。案例總結(jié)前一頁(yè)后一頁(yè)退出1.簡(jiǎn)答題

1.試分別說(shuō)出各調(diào)度方法的特點(diǎn)和用途。

2.簡(jiǎn)述Java語(yǔ)言中線(xiàn)程調(diào)度與所用的操作系統(tǒng)之間的關(guān)系。2.操作題試編寫(xiě)一個(gè)簡(jiǎn)單的文字水平滾動(dòng)動(dòng)畫(huà)Applet程序,要求信息從Applet的顯示區(qū)域自右至左滾動(dòng)顯示,且滾動(dòng)信息用單獨(dú)一個(gè)線(xiàn)程實(shí)現(xiàn),該線(xiàn)程能隨著網(wǎng)頁(yè)的關(guān)閉而自動(dòng)殺死。

習(xí)題6.2前一頁(yè)后一頁(yè)退出單線(xiàn)程程序在同一時(shí)間內(nèi)只能執(zhí)行一項(xiàng)工作,因?yàn)橹挥幸粋€(gè)線(xiàn)程,所以我們不需要考慮與其他線(xiàn)程發(fā)生沖突的可能性。但在多線(xiàn)程情況下,有時(shí)一個(gè)線(xiàn)程必須與其他線(xiàn)程合作才能完成任務(wù),有時(shí)又必須考慮避免訪(fǎng)問(wèn)同一有限資源的沖突問(wèn)題。線(xiàn)程同步的基本思想就是避免多個(gè)線(xiàn)程對(duì)同一資源的同時(shí)訪(fǎng)問(wèn)。在編寫(xiě)多線(xiàn)程程序時(shí),如果不能正確控制線(xiàn)程的同步,可能會(huì)產(chǎn)生意想不到的結(jié)果。

學(xué)習(xí)目標(biāo)通過(guò)本課題的學(xué)習(xí),掌握管程、臨界區(qū)和同步函數(shù)等概念,并學(xué)會(huì)線(xiàn)程同步的控制技術(shù)。

6.3線(xiàn)程同步

前一頁(yè)后一頁(yè)退出本案例程序代碼實(shí)現(xiàn)了對(duì)線(xiàn)程進(jìn)行同步控制的功能。案例32應(yīng)用線(xiàn)程同步判斷兩個(gè)數(shù)值是否相等前一頁(yè)后一頁(yè)退出圖6-6

SynchronizeNumber.java程序運(yùn)行結(jié)果

Java語(yǔ)言中專(zhuān)門(mén)引入了關(guān)鍵字synchronized來(lái)定義臨界區(qū),其一般定義如下:synchronized

<expression>statement其中的expression是對(duì)象或類(lèi)的名字,是可選項(xiàng)。statement既可以是一個(gè)方法定義,也可以是一個(gè)語(yǔ)句塊,當(dāng)用synchronized來(lái)定義方法時(shí),該方法稱(chēng)為同步方法;當(dāng)用synchronized來(lái)定義語(yǔ)句塊時(shí),稱(chēng)該語(yǔ)句塊為同步塊,下面是說(shuō)明同步塊的例子:classRectangle{ Point

topLeft;voidprint(){

synchronized(topLeft){

println(“topLeft.x=”+topLeft.x);

println(“topLeft.y=”+topLeft.y);}}}知識(shí)鏈接前一頁(yè)后一頁(yè)退出上機(jī)完成SynchronizeArray.java程序,程序功能是用兩個(gè)線(xiàn)程調(diào)用同步方法addnumber()來(lái)共同完成對(duì)同一個(gè)數(shù)組array的賦值操作。前一頁(yè)后一頁(yè)退出上機(jī)實(shí)戰(zhàn)圖6-7

SynchronizeArray.java程序運(yùn)行結(jié)果

線(xiàn)程的概念在Java語(yǔ)言中十分重要,圖形界面的動(dòng)畫(huà)顯示和網(wǎng)絡(luò)編程中的聊天室程序等應(yīng)用都大量用到多線(xiàn)程概念。關(guān)鍵字synchronized不僅可限制代碼塊、函數(shù)的同步訪(fǎng)問(wèn),還可以用來(lái)限制對(duì)象和類(lèi),此時(shí)對(duì)象只能同時(shí)被一個(gè)線(xiàn)程訪(fǎng)問(wèn),而類(lèi)的每一個(gè)成員函數(shù)都成為同步函數(shù)。

案例總結(jié)前一頁(yè)后一頁(yè)退出1.簡(jiǎn)答題

1

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論