資源描述:
《Core java經(jīng)典教程十一.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、Java多線程編程進(jìn)程,即運(yùn)行中的程序,多任務(wù)操作系統(tǒng)中并發(fā)的一個(gè)任務(wù)(CPU是分時(shí)間片執(zhí)行多個(gè)進(jìn)程的),線程,其本質(zhì)是進(jìn)程中順序的執(zhí)行流程,進(jìn)程有獨(dú)立的進(jìn)程空間進(jìn)程中的數(shù)據(jù)存放空間(對(duì)空間和??臻g)是獨(dú)立的。線程沒有獨(dú)立的存放數(shù)據(jù)的空間,數(shù)據(jù)存儲(chǔ)空間(堆空間)是共享的,線程間的??臻g是獨(dú)立的,線程消耗的資源比進(jìn)程小。線程,是進(jìn)程(運(yùn)行中的程序)中順序的執(zhí)行流程,進(jìn)程可以劃分出多個(gè)線程。JVM(java虛擬機(jī))本身就是一個(gè)進(jìn)程,java只能夠申請(qǐng)創(chuàng)建線程。操作系統(tǒng)決定線程是否有優(yōu)先級(jí),獨(dú)占式的操作系統(tǒng)中
2、系統(tǒng)會(huì)有優(yōu)先級(jí)的概念,共享式的操作系統(tǒng)則不會(huì)優(yōu)先級(jí)的。Java中的線程也是對(duì)象,線程類是Thread類,線程是操作系統(tǒng)創(chuàng)建并進(jìn)行維護(hù)的資源,線程對(duì)象表示一個(gè)線程,本身不是線程。通過線程對(duì)象來(lái)申請(qǐng)創(chuàng)建,中止線程,訪問底層的線程資源。線程包含了三部分,cpu資源,代碼,數(shù)據(jù)存儲(chǔ)空間。線程對(duì)象調(diào)用start()方法,線程對(duì)象就會(huì)向操作系統(tǒng)申請(qǐng)線程啟動(dòng),除了申請(qǐng)的線程,還有main方法的線程,也就是主線程。注意:只有運(yùn)行狀態(tài)的線程才有機(jī)會(huì)執(zhí)行代碼,主線程的中止不會(huì)影響其他的正在運(yùn)行中的線程,朱線程中止也就是ma
3、in()方法退出了。只有進(jìn)程中的所有線程都中止時(shí),進(jìn)程(JVM進(jìn)程)才會(huì)退出,只要有線程沒有中止,進(jìn)程就不會(huì)退出。線程編程的兩種方法1,寫一個(gè)類,繼承Thread類,覆蓋Thread類中繼承來(lái)的run()方法,這樣就寫好了自定義的線程類。例:publicclassTest{publicstaticvoidmain(String[]args){Threadt=newA();t.start();}classAextendsThread{publicvoidrun(){...}}2,寫一個(gè)類,實(shí)現(xiàn)Runabl
4、e接口,實(shí)現(xiàn)其中的run()方法。這種方法寫好的類的對(duì)象需要作為線程類創(chuàng)建對(duì)象時(shí)構(gòu)造方法的參數(shù)。例:publicclassTest{publicstaticvoidmain(String[]args){Runabler=newb();//目標(biāo)對(duì)象Threadt=newThread(r);//用目標(biāo)對(duì)象構(gòu)造線程對(duì)象t.start();}classbimplementsRunable{publicvoidrun(){...}}Thread類的方法publicstaticvoidsleep(longmilli
5、s)throwsInterruptedException括號(hào)中以毫秒為單位,使線程停止一段時(shí)間,間隔期滿后,線程不一定立即恢復(fù)執(zhí)行。當(dāng)main()運(yùn)行完畢,即使在結(jié)束時(shí)時(shí)間片還沒有用完,CPU也放棄此時(shí)間片,繼續(xù)運(yùn)行其他程序。try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace(e);}publicfinalvoidjoin()throwsInterruptedException表示其他運(yùn)行線程放棄執(zhí)行權(quán),進(jìn)入阻塞狀
6、態(tài),直到調(diào)用線程結(jié)束。實(shí)際上是把并發(fā)的線程變?yōu)榇羞\(yùn)行。線程的優(yōu)先級(jí):1-10,越大優(yōu)先級(jí)越高,優(yōu)先級(jí)越高被OS選中的可能性就越大。(不建議使用,因?yàn)椴煌僮飨到y(tǒng)的優(yōu)先級(jí)并不相同,使得程序不具備跨平臺(tái)性,這種優(yōu)先級(jí)只是粗略地劃分)。注:程序的跨平臺(tái)性:除了能夠運(yùn)行,還必須保證運(yùn)行的結(jié)果。Publicstaticvoidfield()使當(dāng)前線程馬上交出執(zhí)行權(quán),回到可運(yùn)行狀態(tài),等待OS的再次調(diào)用。PublicfinalBooleanisActive()驗(yàn)證當(dāng)前線程是否是活動(dòng)的,不管它是否正在運(yùn)行。線程的生命
7、周期下面為線程中的7中非常重要的狀態(tài):(有的書上也只有認(rèn)為前五種狀態(tài):而將“鎖池”和“等待池”都看成是“阻塞”狀態(tài)的特殊情況:這種認(rèn)識(shí)也是正確的,但是將“鎖池”和“等待池”單獨(dú)分離出來(lái)有利于對(duì)程序的理解)初始可運(yùn)行阻塞運(yùn)行結(jié)束鎖池等待隊(duì)列①⑴②⑵③⑶run()方法運(yùn)行結(jié)束start()OS分配CPUCPU時(shí)間片結(jié)束或調(diào)用yield()o.wait()等待鎖標(biāo)記o.notify()1,初始狀態(tài),線程創(chuàng)建,線程對(duì)象調(diào)用start()方法。2,可運(yùn)行狀態(tài),也就是等待Cpu資源,等待運(yùn)行的狀態(tài)。3,運(yùn)行狀態(tài),獲
8、得了Cpu資源,正在運(yùn)行狀態(tài)。4,阻塞狀態(tài),也就是讓出Cpu資源,進(jìn)入一種等待狀態(tài),而且不是可運(yùn)行狀態(tài),有三種情況會(huì)進(jìn)入阻塞狀態(tài)。1)如等待輸入(輸入設(shè)備進(jìn)行處理,而CPU不處理),則放入阻塞,直到輸入完畢,阻塞結(jié)束后會(huì)進(jìn)入可運(yùn)行狀態(tài)。2)線程休眠,線程對(duì)象調(diào)用sleep()方法,阻塞結(jié)束后會(huì)進(jìn)入可運(yùn)行狀態(tài)。3)線程對(duì)象2調(diào)用線程對(duì)象1的join()方法,那么線程對(duì)象2進(jìn)入阻塞狀態(tài),直到線程對(duì)象1中止。5,中止?fàn)顟B(tài),線程執(zhí)行結(jié)束。所有線程都