項目10 圖片幻燈片播放器_第1頁
項目10 圖片幻燈片播放器_第2頁
項目10 圖片幻燈片播放器_第3頁
項目10 圖片幻燈片播放器_第4頁
項目10 圖片幻燈片播放器_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

項目10圖片幻燈片播放器本章目標(biāo)了解多線程的概念掌握線程的創(chuàng)建和啟動掌握線程的生命周期本章任務(wù)制作圖片幻燈片播放器,如下圖所示

1.多線程概念-進程進程:程序運行的基本單元,是指運行中的應(yīng)用程序,每一個進程都有自己獨立的內(nèi)存空間。對一個應(yīng)用程序可以同時啟動多個進程。

例如每次執(zhí)行JDK的java.exe程序,就啟動了一個獨立的Java虛擬機進程,該進程的任務(wù)是解析并執(zhí)行Java程序代碼。1.多線程概念-線程線程是指進程中的一個執(zhí)行流程,有時也稱為執(zhí)行情景。一個進程可以由多個線程組成,即在一個進程中可以同時運行多個不同的線程,它們分別執(zhí)行不同的任務(wù)。當(dāng)進程內(nèi)的多個線程同時運行,這種運行方式稱為并發(fā)運行。圖

多線程執(zhí)行方式

線程和進程的主要差別:一個程序至少有一個進程,一個進程至少有一個線程.線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。每個進程都有一段專用的內(nèi)存區(qū)域。與此相反,線程卻共享內(nèi)存單元(包括代碼和數(shù)據(jù)),通過共享的內(nèi)存單元來實現(xiàn)數(shù)據(jù)交換、實時通信與必要的同步操作。

1.多線程概念-線程和進程區(qū)別主線程每當(dāng)用java命令啟動一個Java虛擬機進程,Java虛擬機就會創(chuàng)建一個主線程,該線程從程序入口main()方法開始執(zhí)行。

publicclassSample{publicvoidmethod1(){System.out.println(“hellojava”);}publicvoidmethod2(){method1();}publicstaticvoidmain(Stringargs[]){Samples=newSample();s.method2();}}main()方法method2()方法method1()方法主線程的方法調(diào)用棧2.線程的創(chuàng)建和啟動線程創(chuàng)建2種方法:繼承Thread類,定義一個Thread類的子類,覆蓋Thread類的run()方法,然后創(chuàng)建該子類的實例。實現(xiàn)Runnable接口來創(chuàng)建線程。定義一個實現(xiàn)Runnable接口的類,實現(xiàn)它的run()方法,然后將這個類的實例作為Thread的構(gòu)造方法的參數(shù),創(chuàng)建Thread類的實例。其中,Thread類和Runnable接口都定義在包java.lang中。2.線程的創(chuàng)建和啟動調(diào)用start()方法啟動線程。比如,MyThreadt=newMyThread(); t.start();

1).繼承Thread類以創(chuàng)建線程class類名稱extendsThread //繼承自Thread類{

成員變量;

成員方法;

publicvoidrun()//重寫run方法

{//線程處理的代碼

}}

創(chuàng)建Thread類的子類classMyThreadextendsThread{

public

voidrun(){

for(inti=1;i<=10;i++)System.out.println(this.getName()+":"+i);}}public

classThreadDemo1{

public

static

voidmain(String[]args){MyThreadt=newMyThread();

t.start();

}}Thread類的常用方法currentThread()返回當(dāng)前運行的Thread對象。start()啟動一個線程。run()線程體,由start()方法調(diào)用,當(dāng)run()方法返回時,當(dāng)前的線程結(jié)束。stop()使調(diào)用它的線程立即停止執(zhí)行。sleep(intn)使線程睡眠n毫秒,n毫秒后,線程可以再次運行。suspend()使線程掛起,暫停運行。resume()恢復(fù)掛起的線程,使其處于可運行狀態(tài)(Runnable)。yield()將CPU控制權(quán)主動移交到下一個可運行線程。setPriority()設(shè)置線程優(yōu)先級。getPriority()返回線程優(yōu)先級。setName()設(shè)置線程的名字。getName()返回該線程的名字。isAlive()如果線程已被啟動并且未被終止,那么isAlive()返回true。如果返回false,則該線程是新創(chuàng)建或是已被終止的。

1)線程的睡眠(sleep)線程的睡眠是指運行中的線程暫時放棄CPU,轉(zhuǎn)到阻塞狀態(tài)。通過調(diào)用Thread類的sleep()方法線程在睡眠時若被中斷將會拋出一個InterruptedException異常

2)線程的讓步(yield)功能與sleep()方法相似兩者的區(qū)別如下:sleep()是將CPU出讓給其他任何線程,而yield()方法只會給優(yōu)先級更高或同優(yōu)先級的線程運行的機會。sleep()方法使當(dāng)前運行的線程轉(zhuǎn)到阻塞狀態(tài),在指定的時間內(nèi)肯定不會執(zhí)行;而yield()方法將使運行的線程進入就緒狀態(tài),所以執(zhí)行yield()的線程有可能在進入到就緒狀態(tài)后馬上又被執(zhí)行。

3)線程的掛起與恢復(fù)(suspend與resume)通過調(diào)用Thread類提供的suspend()方法可暫停正在運行的線程,使其進入阻塞狀態(tài);可通過resume()方法恢復(fù)。主線程和多個線程 packagech11;classMyThread2extends

Thread{MyThread2(Stringstr){super(str);}

publicvoidrun(){for(inti=1;i<=5;i++)System.out.println(this.getName()+":"+i);}}publicclassThreadDemo2{publicstaticvoidmain(String[]args){MyThread2t1=newMyThread2("線程1");MyThread2t2=newMyThread2("線程2");t1.start();t2.start();for(inti=1;i<=5;i++)System.out.println(Thread.currentThread().getName()+":"+i);}}2).實現(xiàn)Runnable接口以創(chuàng)建線程classMyRunnableimplements

Runnable{

publicvoidrun()

{

//新建線程上執(zhí)行的代碼

}}實現(xiàn)Runnable接口classMyRunnerimplementsRunnable{publicvoidrun(){ Strings=Thread.currentThread().getName();for(inti=1;i<=10;i++)System.out.println(s+":"+i);}}publicclassRunnerDemo{publicstaticvoidmain(String[]args){MyRunnerr1=newMyRunner();Threadt1=newThread(r1,"線程1");Threadt2=newThread(r1,"線程2");t1.start();t2.start();for(inti=1;i<=10;i++)System.out.println("main主線程"+":"+i);}}不同方法創(chuàng)建線程的比較實現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢:1)適合多個相同的程序代碼的線程去處理同一個資源;2)可以避免java中的單繼承的限制;3)增加程序的健壯性,代碼可以被多個線程共享,代碼和數(shù)據(jù)獨立。如何實現(xiàn)字幕滾動?JFrame界面一個組件:JLabel利用多線程設(shè)置JLabel標(biāo)簽的值多線程實現(xiàn)字幕滾動

2.線程的優(yōu)先級線程調(diào)度器按照線程的優(yōu)先級決定調(diào)度哪些線程來執(zhí)行線程的調(diào)度是搶先式的在Java中,線程的優(yōu)先級是用整數(shù)表示的,取值范圍是1~10。低優(yōu)先級:Thread.MIN_PRIORITY,取值為1。缺省優(yōu)先級:Thread.NORM_PRIORITY,取值為5。

高優(yōu)先級:Thread.MAX_PRIORITY,取值為10。

3.線程的管理1).線程的狀態(tài)

線程在它的生命周期中一般具有五種狀態(tài),即新建、就緒、運行、堵塞和死亡。線程的狀態(tài)轉(zhuǎn)換圖如圖所示。圖

線程的狀態(tài)轉(zhuǎn)換線程的不同狀態(tài)1、新建狀態(tài)當(dāng)用new操作符創(chuàng)建一個新的線程對象時,該線程處于創(chuàng)建狀態(tài)。處于創(chuàng)建狀態(tài)的線程只是一個空的線程對象,系統(tǒng)不為它分配資源。2、就緒狀態(tài)處于就緒狀態(tài)的線程已經(jīng)具備了運行條件,但還沒有分配到CPU,處于線程就緒隊列,等待系統(tǒng)為其分配CPU。3、運行狀態(tài)處于運行狀態(tài)的線程最為復(fù)雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。處于就緒狀態(tài)的線程,如果獲得了cpu的調(diào)度,就會從就緒狀態(tài)變?yōu)檫\行狀態(tài),執(zhí)行run()方法中的任務(wù)。如果該線程失去了cpu資源,就會又從運行狀態(tài)變?yōu)榫途w狀態(tài)。重新等待系統(tǒng)分配資源。也可以對在運行狀態(tài)的線程調(diào)用yield()方法,它就會讓出cpu資源,再次變?yōu)榫途w狀態(tài)。線程的不同狀態(tài)4、阻塞狀態(tài)處于運行狀態(tài)的線程在某些情況下,如執(zhí)行了sleep(睡眠)方法,或等待I/O設(shè)備等資源,將讓出CPU并暫時停止自己的運行,進入阻塞狀態(tài)。在阻塞狀態(tài)的線程不能進入就緒隊列。只有當(dāng)引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O設(shè)備空閑下來,線程便轉(zhuǎn)入就緒狀態(tài),重新到就緒隊列中排隊等待,被系統(tǒng)選中后從原來

溫馨提示

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

最新文檔

評論

0/150

提交評論