資源描述:
《Java基礎(chǔ)加強(qiáng)多線程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、多線程第二章使用多線程實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題使用多線程實(shí)現(xiàn)龜兔賽跑使用多線程實(shí)現(xiàn)多個(gè)用戶安全存取一個(gè)賬戶本章目標(biāo)點(diǎn)重點(diǎn)重點(diǎn)難第2頁/共38頁點(diǎn)重概述線程基礎(chǔ)進(jìn)程與線程線程分類多線程的優(yōu)勢(shì)線程控制線程的創(chuàng)建和啟動(dòng)線程的狀態(tài)線程調(diào)度線程同步線程同步的必要性線程同步的實(shí)現(xiàn)死鎖線程間通信線程間通信的必要性線程間通信的實(shí)現(xiàn)進(jìn)程和線程2-1程序程序是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本進(jìn)程進(jìn)程是指一種正在運(yùn)行的程序,有自己的地址空間進(jìn)程的特點(diǎn)動(dòng)態(tài)性并發(fā)性獨(dú)立性進(jìn)程和線程2-2線程的定義進(jìn)程內(nèi)部的一個(gè)執(zhí)行單元,它是程序中一個(gè)單一的順序控制流程。如果在一個(gè)進(jìn)程中同時(shí)運(yùn)行了多
2、個(gè)線程,用來完成不同的工作,則稱之為多線程線程的定義進(jìn)程是系統(tǒng)資源分配的單位,可包括多個(gè)線程線程是獨(dú)立調(diào)度和分派的基本單位,共享進(jìn)程資源引入進(jìn)程是為了多個(gè)程序并發(fā)執(zhí)行,提高資源的利用率和系統(tǒng)吞吐量引入線程是為了減少程序在并發(fā)執(zhí)行時(shí)付出的時(shí)空開銷線程分類系統(tǒng)級(jí)線程(核心級(jí)線程):由操作系統(tǒng)內(nèi)核進(jìn)行管理,使用戶程序可以創(chuàng)建、執(zhí)行、撤銷線程用戶級(jí)線程管理過程全部由用戶程序完成,操作系統(tǒng)內(nèi)核只對(duì)進(jìn)程進(jìn)行管理多線程的優(yōu)勢(shì)多線程使系統(tǒng)空轉(zhuǎn)時(shí)間減少,提高CPU利用率進(jìn)程間不能共享內(nèi)存,但線程之間共享內(nèi)存非常容易使用多線程實(shí)現(xiàn)多任務(wù)并發(fā)比多進(jìn)程的效率高Java語言內(nèi)置多線程功
3、能支持,簡化了Java的多線程編程線程的創(chuàng)建和啟動(dòng)6-1兩種方法來創(chuàng)建線程繼承Java.lang.Thread類,并覆蓋run()方法實(shí)現(xiàn)Java.lang.Runnable接口,并實(shí)現(xiàn)run()方法classMyThreadextendsThread{publicvoidrun(){/*覆蓋該方法*/}}classMyThreadimplementsRunnable{publicvoidrun(){/*實(shí)現(xiàn)該方法*/}}線程的創(chuàng)建和啟動(dòng)6-2啟動(dòng)線程新建的線程不會(huì)自動(dòng)開始運(yùn)行,必須通過start()方法啟動(dòng)啟動(dòng)繼承Thread的線程啟動(dòng)實(shí)現(xiàn)Runnable接
4、口的線程MyThreadt=newMyThread();t.start();MyThreadmt=newMyThread();Threadt=newThread(mt);t.start();線程的創(chuàng)建和啟動(dòng)6-3繼承Java.lang.Thread類publicclassThreadDemo1{publicstaticvoidmain(Stringargs[]){MyThread1t=newMyThread1();t.start();while(true){System.out.println("兔子領(lǐng)先了,別驕傲");}}}classMyThread1ext
5、endsThread{publicvoidrun(){while(true){System.out.println("烏龜領(lǐng)先了,加油");}}}線程的創(chuàng)建和啟動(dòng)6-4實(shí)現(xiàn)Java.lang.Runnable接口publicclassThreadDemo2{publicstaticvoidmain(Stringargs[]){MyThread2mt=newMyThread2();Threadt=newThread(mt);t.start();while(true){System.out.println("兔子領(lǐng)先了,加油");}}}classMyThread2
6、implementsRunnable{publicvoidrun(){while(true){System.out.println("烏龜超過了,再接再厲");}}}線程的創(chuàng)建和啟動(dòng)6-5兩種線程創(chuàng)建方式的比較繼承Thread類方式的多線程優(yōu)勢(shì):編寫簡單劣勢(shì):無法繼承其它父類實(shí)現(xiàn)Runnable接口方式的多線程優(yōu)勢(shì):可以繼承其它類,多線程可共享同一個(gè)Thread對(duì)象劣勢(shì):編程方式稍微復(fù)雜,如果需要訪問當(dāng)前線程,需要調(diào)用Thread.currentThread()方法線程的創(chuàng)建和啟動(dòng)6-6Thread類的常用方法方法功能staticThreadcurrentTh
7、read()得到當(dāng)前線程finalStringgetName()返回線程的名稱finalvoidsetName(Stringname)將線程的名稱設(shè)置為由name指定的名稱voidstart()調(diào)用run()方法啟動(dòng)線程,開始線程的執(zhí)行voidrun()存放線程體代碼線程的狀態(tài)新生使用new關(guān)鍵字創(chuàng)建一個(gè)線程后,尚未調(diào)用其start方法之前可運(yùn)行調(diào)用線程對(duì)象的start方法之后這個(gè)狀態(tài)當(dāng)中,線程對(duì)象可能正在運(yùn)行,也可能等待運(yùn)行阻塞一種“不可運(yùn)行”的狀態(tài),在得到一個(gè)特定的事件之后會(huì)返回到可運(yùn)行狀態(tài)死亡線程的run方法運(yùn)行完畢或者在運(yùn)行中出現(xiàn)未捕獲的異常時(shí)線程調(diào)度
8、6-1優(yōu)先級(jí)概述每個(gè)線程執(zhí)行時(shí)都具有一