項(xiàng)目9 多線程技術(shù)_第1頁(yè)
項(xiàng)目9 多線程技術(shù)_第2頁(yè)
項(xiàng)目9 多線程技術(shù)_第3頁(yè)
項(xiàng)目9 多線程技術(shù)_第4頁(yè)
項(xiàng)目9 多線程技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

多線程技術(shù)項(xiàng)目九高等院校公共課系列精品教材Java開(kāi)發(fā)綜合實(shí)戰(zhàn)尊重事物的發(fā)展規(guī)律,學(xué)會(huì)科學(xué)地分配作息時(shí)間。厚植報(bào)國(guó)情懷,使課程知識(shí)與思政同向同行、齊頭并進(jìn)思政目標(biāo)能夠通過(guò)繼承Thread類和實(shí)現(xiàn)Runnable接口兩種方法創(chuàng)建線程能夠根據(jù)實(shí)際需求轉(zhuǎn)換線程的狀態(tài)能夠?qū)崿F(xiàn)線程同步并協(xié)調(diào)同步的線程技能目標(biāo)在現(xiàn)實(shí)生活中,很多事情都是同時(shí)進(jìn)行的。Java引入了線程機(jī)制,可以同時(shí)運(yùn)行不同的程序塊,不僅程序運(yùn)行更為順暢,同時(shí)也可達(dá)到多任務(wù)處理的目的。掌握多線程技術(shù),可以充分利用CPU的資源,提升單位時(shí)間內(nèi)的程序處理性能,是現(xiàn)代程序開(kāi)發(fā)中高并發(fā)的主要設(shè)計(jì)形式。本項(xiàng)目將詳細(xì)介紹多線程的相關(guān)知識(shí),主要內(nèi)容包括線程的創(chuàng)建、線程的狀態(tài)、線程的操作方法,以及線程的同步與交互等。項(xiàng)目導(dǎo)讀任務(wù)1實(shí)現(xiàn)Java多線程任務(wù)2應(yīng)用多線程知識(shí)梳理實(shí)現(xiàn)Java多線程任務(wù)1任務(wù)1實(shí)現(xiàn)Java多線程任務(wù)引入既然開(kāi)發(fā)了網(wǎng)絡(luò)版的應(yīng)用程序,就有可能涉及多人同時(shí)操作管理系統(tǒng)的問(wèn)題,這就需要用到多線程技術(shù)。小白知道多線程是Java的重要特性之一,什么是線程呢?在Java中如何實(shí)現(xiàn)多線程呢?000000在Java中,線程是一種繼承了Thread類或者實(shí)現(xiàn)了Runnable接口的對(duì)象。對(duì)應(yīng)地,創(chuàng)建線程有兩種方式:一種是繼承Thread類,另一種是實(shí)現(xiàn)Runnable接口。一、進(jìn)程與線程在Windows中,每一個(gè)在操作系統(tǒng)中運(yùn)行的應(yīng)用程序都是一個(gè)進(jìn)程(process)。進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。每一個(gè)進(jìn)程都有獨(dú)立的內(nèi)存空間和系統(tǒng)資源,其內(nèi)部數(shù)據(jù)和狀態(tài)也是完全獨(dú)立的。程序從加載、執(zhí)行到執(zhí)行完畢的過(guò)程,就是進(jìn)程從產(chǎn)生、發(fā)展到消亡的過(guò)程。CPU同一時(shí)刻只能運(yùn)行一個(gè)進(jìn)程,利用CPU的分時(shí)機(jī)制,每個(gè)進(jìn)程都能循環(huán)獲得自己的CPU時(shí)間片。由于CPU的輪換速度非???,以至于用戶感覺(jué)不到進(jìn)程的中斷,產(chǎn)生所有程序“同時(shí)”運(yùn)行的錯(cuò)覺(jué)。線程是進(jìn)程的組成部分,也稱為輕量級(jí)進(jìn)程(LWP),一個(gè)線程是進(jìn)程中的一個(gè)執(zhí)行流程。每個(gè)Java應(yīng)用程序都有一個(gè)缺省的主線程(main線程)。這個(gè)主線程就是JVM加載代碼發(fā)現(xiàn)main()方法后啟動(dòng)的線程,負(fù)責(zé)執(zhí)行main()方法。任務(wù)1實(shí)現(xiàn)Java多線程二、線程的狀態(tài)為方便操作系統(tǒng)管理線程,線程要經(jīng)歷不同的生命階段。線程被創(chuàng)建以后,CPU需要在多條線程之間切換,因此線程既不是一啟動(dòng)就進(jìn)入執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài)。在線程的生命周期中,它要經(jīng)過(guò)新建(New)、就緒(Runnable)、運(yùn)行(Running)、阻塞(Blocked)和消亡(Dead)五種狀態(tài)。1.新建狀態(tài)一個(gè)線程對(duì)象被聲明并創(chuàng)建時(shí),該線程就處于新建狀態(tài),此時(shí)僅由JVM為其分配內(nèi)存空間,并初始化其成員變量的值。2.就緒狀態(tài)線程對(duì)象調(diào)用start()方法之后,該線程就處于就緒狀態(tài),進(jìn)入線程隊(duì)列排列,等待調(diào)度運(yùn)行。任務(wù)1實(shí)現(xiàn)Java多線程3.運(yùn)行狀態(tài)如果處于就緒狀態(tài)的線程獲得了CPU資源,就開(kāi)始執(zhí)行run()方法中的線程執(zhí)行體,此時(shí)該線程處于運(yùn)行狀態(tài)。4.阻塞狀態(tài)當(dāng)處于運(yùn)行狀態(tài)的線程失去所占用資源之后,便進(jìn)入阻塞狀態(tài)。在Java中,線程進(jìn)入阻塞狀態(tài)可能有以下4種原因。(1)JVM將CPU資源切換給其他線程。(2)線程執(zhí)行了sleep(intmillsecond)方法進(jìn)入休眠狀態(tài)。(3)線程執(zhí)行了wait()方法進(jìn)入等待狀態(tài)。(4)線程執(zhí)行某個(gè)操作(例如運(yùn)行耗時(shí)的I/O操作)進(jìn)入阻塞狀態(tài)。5.消亡狀態(tài)線程因異常被強(qiáng)制結(jié)束或執(zhí)行完run()方法,線程結(jié)束生命周期就會(huì)處于消亡狀態(tài)。任務(wù)1實(shí)現(xiàn)Java多線程三、繼承Thread類實(shí)現(xiàn)多線程Thread類是java.lang包中的一個(gè)類,在使用時(shí)不需要引入java.lang包,系統(tǒng)會(huì)自動(dòng)加載。使用Thread類實(shí)現(xiàn)線程的步驟如下:(1)繼承Thread類,并重寫(xiě)run()方法。(2)創(chuàng)建Thread子類的實(shí)例,即創(chuàng)建線程對(duì)象。Thread類創(chuàng)建線程有以下兩個(gè)常用的構(gòu)造方法:publicThread():創(chuàng)建一個(gè)線程對(duì)象。publicThread(StringthreadName):創(chuàng)建一個(gè)有指定名稱的線程對(duì)象。(3)調(diào)用線程對(duì)象的start()方法啟動(dòng)線程。任務(wù)1實(shí)現(xiàn)Java多線程案例——模擬喂養(yǎng)寵物本案例通過(guò)繼承Thread類創(chuàng)建兩個(gè)線程,輸出寵物吃東西、喝水,使用主線程輸出寵物玩耍,演示多線程的運(yùn)行效果。任務(wù)1實(shí)現(xiàn)Java多線程運(yùn)行結(jié)果四、使用Runnable接口實(shí)現(xiàn)多線程線程對(duì)象除了可以繼承Thread類創(chuàng)建,還可以通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建。與前一種方式相比,使用Runnable接口方式可以避免單繼承的局限,在繼承非Thread類時(shí)實(shí)現(xiàn)多線程。使用Runnable接口實(shí)現(xiàn)線程的步驟如下:(1)定義Runnable接口的實(shí)現(xiàn)類,并重寫(xiě)該接口的run()方法。(2)創(chuàng)建Runnable接口實(shí)現(xiàn)類的實(shí)例作為線程對(duì)象的運(yùn)行對(duì)象,傳遞給構(gòu)造方法創(chuàng)建線程對(duì)象。任務(wù)1實(shí)現(xiàn)Java多線程Runnable接口的實(shí)現(xiàn)類采用以下兩種構(gòu)造方法創(chuàng)建Thread對(duì)象。publicThread(Runnabletarget):使用實(shí)現(xiàn)了Runnable接口的類對(duì)象target作為運(yùn)行對(duì)象,創(chuàng)建一個(gè)線程對(duì)象。publicThread(Runnabletarget,Stringname):使用一個(gè)有指定名稱的對(duì)象target作為運(yùn)行對(duì)象,創(chuàng)建線程對(duì)象。(3)調(diào)用線程對(duì)象的start()方法啟動(dòng)線程。任務(wù)1實(shí)現(xiàn)Java多線程案例——模擬外賣訂單本案例通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建一個(gè)線程,輸出一個(gè)外賣訂單,使用主線程輸出一個(gè)訂單,演示多線程的運(yùn)行效果。任務(wù)1實(shí)現(xiàn)Java多線程運(yùn)行結(jié)果應(yīng)用多線程任務(wù)2任務(wù)引入通過(guò)上一個(gè)任務(wù)的學(xué)習(xí),小白掌握了創(chuàng)建線程的方法,他明白,要想掌握多線程編程,就必須了解線程的生命周期,以及線程各種狀態(tài)的切換。此外,他還想知道如何將線程的特性應(yīng)用于解決各類實(shí)際問(wèn)題。知識(shí)準(zhǔn)備一、線程的常用方法

前面提到過(guò),線程創(chuàng)建后,調(diào)用start()方法進(jìn)入就緒狀態(tài),在線程隊(duì)列中排隊(duì)等待執(zhí)行;當(dāng)線程獲取CPU資源時(shí)就自動(dòng)執(zhí)行run()方法,進(jìn)入運(yùn)行狀態(tài)。在實(shí)際應(yīng)用中,經(jīng)常需要根據(jù)程序流程操作線程,強(qiáng)制使線程從某一種狀態(tài)轉(zhuǎn)換到另一種狀態(tài)。下面簡(jiǎn)要介紹操作線程常用的幾個(gè)方法。任務(wù)2應(yīng)用多線程1.start()方法該方法用于啟動(dòng)線程,使新建狀態(tài)的線程轉(zhuǎn)換為就緒狀態(tài),進(jìn)入線程隊(duì)列。2.run()方法該方法用于指定線程要執(zhí)行的具體操作,當(dāng)線程獲得CPU資源后由系統(tǒng)自動(dòng)調(diào)用該方法,使就緒狀態(tài)的線程進(jìn)入運(yùn)行狀態(tài)。該方法執(zhí)行完成之后,線程進(jìn)入消亡狀態(tài)。3.sleep()方法默認(rèn)情況下,線程按照優(yōu)先級(jí)從高到低的順序調(diào)度執(zhí)行,如果優(yōu)先級(jí)高的線程未消亡,優(yōu)先級(jí)低的線程就沒(méi)有機(jī)會(huì)獲得CPU資源。通過(guò)在高級(jí)別線程的run()方法中調(diào)用sleep()方法,可以使高級(jí)別的線程暫時(shí)進(jìn)入休眠,從而低級(jí)別的線程有機(jī)會(huì)執(zhí)行。任務(wù)2應(yīng)用多線程4.isAlive()方法該方法用于判斷線程是否啟動(dòng)。處于新建狀態(tài)和消亡狀態(tài)的線程可調(diào)用isAlive()方法,返回false。5.currentThread()方法該方法是Thread類的一個(gè)靜態(tài)方法,返回當(dāng)前正在使用CPU資源的線程。6.interrupt()方法一個(gè)占有CPU資源的線程可以使用該方法“吵醒”(中斷)正在休眠的線程。任務(wù)2應(yīng)用多線程7.join()方法該方法可以強(qiáng)制某個(gè)線程運(yùn)行,在此期間,其他線程進(jìn)入阻塞狀態(tài),必須等待此線程消亡之后才可以繼續(xù)執(zhí)行。8.setPriority()方法在多線程環(huán)境下,系統(tǒng)根據(jù)線程的優(yōu)先級(jí)決定就緒狀態(tài)下哪個(gè)線程首先進(jìn)入運(yùn)行狀態(tài)。9.yield()方法該方法可以暫停當(dāng)前正在執(zhí)行的線程,使線程進(jìn)入阻塞狀態(tài),其他具有相同優(yōu)先級(jí)的線程有進(jìn)入運(yùn)行狀態(tài)的機(jī)會(huì)。任務(wù)2應(yīng)用多線程案例——模擬VIP插隊(duì)排號(hào)本案例使用join()方法阻塞當(dāng)前線程,模擬銀行柜臺(tái)VIP插隊(duì)排號(hào)。任務(wù)2應(yīng)用多線程運(yùn)行結(jié)果二、實(shí)現(xiàn)線程同步所謂線程同步,是指一個(gè)線程調(diào)用使用關(guān)鍵字synchronized修飾的方法或代碼塊時(shí),其他線程要使用這個(gè)代碼塊或方法就必須等待,直到上一個(gè)線程使用完該代碼塊或方法。實(shí)現(xiàn)線程同步有兩種方式:同步塊和同步方法。1.同步塊使用關(guān)鍵字synchronized修飾的代碼塊稱為同步塊,也稱為臨界區(qū)2.同步方法所謂同步方法,就是使用關(guān)鍵字synchronized修飾多個(gè)線程都要使用的方法任務(wù)2應(yīng)用多線程案例——模擬景區(qū)售票因疫情防控,某景區(qū)開(kāi)放了3個(gè)售票窗口實(shí)行限流售票。本案例使用同步代碼塊模擬景區(qū)售票。任務(wù)2應(yīng)用多線程運(yùn)行結(jié)果三、協(xié)調(diào)同步的線程在程序中,如果一個(gè)線程使用的同步方法要用到某個(gè)變量,而該變量又需要其他線程修改后才能使用,此時(shí)可以在同步方法中使用wait()方法中斷線程,使其等待,并允許其他線程執(zhí)行這個(gè)同步方法。其他線程執(zhí)行完這個(gè)同步方法時(shí),使用notify()方法或notifyAll()方法通知等待執(zhí)行這個(gè)同步方法的線程進(jìn)入就緒隊(duì)列,等待分配系統(tǒng)資源,以從中斷處開(kāi)始執(zhí)行。如果有多個(gè)處于等待的線程,則遵循“先中斷先繼續(xù)”原則進(jìn)入運(yùn)行狀態(tài)。注意:wait()、notify()和notifyAll()方法只能用在同步塊或同步方法中,且不允許重寫(xiě)。任務(wù)2應(yīng)用多線程1.wait()方法該方法與sleep()方法的功能類似,在非多線程運(yùn)行條件下的情況都是當(dāng)前線程讓出執(zhí)行機(jī)會(huì),進(jìn)入休眠/等待。2.notify()方法該方法用于通知等待隊(duì)列中的第一個(gè)線程從等待狀態(tài)進(jìn)入就緒狀態(tài)。3.notifyAll()方法該方法用于通知等待隊(duì)列中的所有線程從等待狀態(tài)進(jìn)入就緒狀態(tài)。任務(wù)2應(yīng)用多線程提示:在實(shí)際應(yīng)用中,wait()方法通常放在一個(gè)while(等待條件){}循環(huán)結(jié)構(gòu)中。案例——排隊(duì)購(gòu)買(mǎi)蛋糕顧客在蛋糕店排隊(duì)購(gòu)買(mǎi)蛋糕,但現(xiàn)在只剩芝士蛋糕了,如果需要其他蛋糕,則需要等待。本案例利用wait()方法和notifyAll()方法模擬排隊(duì)買(mǎi)蛋糕的場(chǎng)景。任務(wù)2應(yīng)用多線程運(yùn)行結(jié)果四、GUI線程在運(yùn)行包含圖形用戶界面的Java應(yīng)用程序時(shí),JVM會(huì)自動(dòng)啟動(dòng)一些專門(mén)用來(lái)監(jiān)聽(tīng)和響應(yīng)用戶在圖形用戶界面上的操作的GUI線程。GUI線程負(fù)責(zé)建造窗體以及處理GUI事件,任何一個(gè)特定窗體的消息總是被產(chǎn)生這一窗體的線程捕獲,然后派發(fā)給不同的窗體函數(shù)處理。GUI線程中有兩個(gè)重要的線程:AWT-EventQuecue和AWT-Windows。AWT-EventQuecue線程負(fù)責(zé)處理GUI事件,而AWT-Windows線程負(fù)責(zé)將窗體或組件繪制到桌面。在創(chuàng)建有GUI的Java多線程應(yīng)用程序時(shí),通常會(huì)繼承JFrame類,并實(shí)現(xiàn)Runnable接口和需要的事件監(jiān)聽(tīng)接口。任務(wù)2應(yīng)用多線程案例——字母游戲本案例利用Swing組件、GUI事件和多線程,制作一個(gè)字母游戲。任務(wù)2應(yīng)用多線程運(yùn)行結(jié)果1

運(yùn)行結(jié)果2項(xiàng)目總結(jié)本章將在上一章完成的項(xiàng)目基礎(chǔ)上進(jìn)行修改,分別創(chuàng)建服務(wù)器端線程和客戶端線程。當(dāng)一個(gè)客戶端訪問(wèn)服務(wù)器時(shí),就會(huì)新建一個(gè)線程處理這個(gè)客戶端的事務(wù),從而可以處理多個(gè)用戶的請(qǐng)求。(1)復(fù)制并粘貼“進(jìn)銷存管理系統(tǒng)V8.0”,在CopyProject對(duì)話框中修改項(xiàng)目名稱為“進(jìn)銷存管理系統(tǒng)V9.0”,然后單擊Copy按鈕關(guān)閉對(duì)話框。(2)在net包中新建一個(gè)名為ServerThread.java的類,繼承Thread類,用于創(chuàng)建服務(wù)器端線程。、(3)打開(kāi)Server.java項(xiàng)目實(shí)戰(zhàn)(4)在net包中新建一個(gè)名為ClientThread的類,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論