版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
線程VS
進(jìn)程創(chuàng)建和啟動線程的方式實(shí)現(xiàn)Runnable接口繼承自Thread類線程的狀態(tài)轉(zhuǎn)換線程的調(diào)度和優(yōu)先級sleep,join,yieldsynchronized線程同步死鎖問題線程間的通信wait
、notify/notifyAll生產(chǎn)者、消費(fèi)者問題ThreadLocal線程局部變量守護(hù)線程接口回調(diào)進(jìn)程(Process)每個獨(dú)立運(yùn)行著的程序稱為一個進(jìn)程.線程(Thread)線程是一個進(jìn)程
的一條執(zhí)行路徑,Java虛擬機(jī)允許應(yīng)用程序并發(fā)地運(yùn)行多個執(zhí)行路徑線程是輕量級的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨(dú)立的運(yùn)行棧和程序計數(shù)器(PC),線程切換的開銷小。線程和進(jìn)程的區(qū)別每個進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程間的切換開銷大線程:同一進(jìn)程內(nèi)的線程共享代碼和數(shù)據(jù)空間,線程切換的開銷小多進(jìn)程:在操作系統(tǒng)中能同時運(yùn)行多個任務(wù)(程序)多線程:在同一進(jìn)程有多個并發(fā)任務(wù)在執(zhí)行.多線程機(jī)制讓系統(tǒng)能夠更高效地利用CPU資源,同時讓固定流程的程序變得更靈活.讓一個程序可以同時干很多事情.3兩種創(chuàng)建新線程的方式第一種:定義實(shí)現(xiàn)Runnable接口的類Runnable接口中只有一個方法public
void
run();用來定義線程運(yùn)行體:。class
MyRun
implements
Runnable{ public
voidrun(){…}
}創(chuàng)建線程的實(shí)例的時候?qū)⑦@個類的實(shí)例作為參數(shù)傳遞到線程實(shí)例然后再啟動:Thread
thread1
=
new
Thread(new
MyRun());thread1.start();第二種:將類 為Thread
的子類并重寫run()方法class
MyThread
extends
Thread{ public
voidrun(){…}
}創(chuàng)建此線程類的實(shí)例并啟動:MyThread
thread1
=
new
MyThread();thread1.start();4public
class
TestThread1{public
static
void
main(String[]
args)
{Runner
runner=new
Runner();//創(chuàng)建Runnable實(shí)現(xiàn)類的對象Threadthread1=
newThread(runner);thread1.start();for(int
i
=
0;
i<
100;
i++){System.out.println("-------MainThread:"
+
i);}}}class
Runner
implements
Runnable{public
void
run()
{for(int
i
=0;
i
<
100;i++){System.out.println("runner:"
+
i);}}}TestThread1.java5TestThread2.javapublic
class
TestThread2{public
static
void
main(String[]
args)
{MyThreadthread1
=newMyThread();thread1.start();for(int
i
=0;
i
<
100;i++){System.out.println("-------MainThread:"
+
i);}}}class
MyThread
extends
Thread{public
void
run()
{for(int
i
=0;
i
<
100;i++){System.out.println("MyThread:"
+
i);}}}6Java的線程是通過java.lang.Thread類來實(shí)現(xiàn)的。當(dāng)程序啟動運(yùn)行時,JVM會產(chǎn)生一個線程(主線程),主方法(main方法)就是在這個線程上運(yùn)行的??梢酝ㄟ^創(chuàng)建Thread的實(shí)例來創(chuàng)建新的線程。每個線程都是通過某個特定Thread對象所對應(yīng)的方法run()來完成其操作的,方法run()稱為線程體。通過調(diào)用Thread類的start()方法來啟動一個線程。線程進(jìn)入Runnable(可運(yùn)行)狀態(tài),它將向線程調(diào)度器 這個線程。調(diào)用start()方法并不一定馬上會執(zhí)行這個線程,正如上面所說,它只是進(jìn)入Runnable
而不是Running。同一個線程對象的start()方法只能調(diào)用一次,不能重復(fù)啟動,無論線程是否已經(jīng)結(jié)束.注意,不要直接在程序中調(diào)用線程的run()方法。7使用Runnable接口還可以從其他類繼承;保持程序風(fēng)格的一致性。直接繼承Thread類不能再從其他類繼承;編寫簡單,可以直接 線程使用實(shí)現(xiàn)Runnable接口的方式創(chuàng)建線程時可以為相同程序代碼的多個線程提供共享的數(shù)據(jù)(見下頁)public
class
MyRun
implements
Runnable{public
int
count=100;//共享的數(shù)據(jù)public
voidrun(){......}}...MyRun
r
=
newMyRun();//t1與t2共享了MyRun的對象Thread
t1
=
new
Thread(r);Thread
t2=
new
Thread(r);//t1.start();t2.start();...public
void
start()使該線程進(jìn)入"就緒"("可運(yùn)行")狀態(tài)public
static
Thread
currentThread()返回對當(dāng)前正在執(zhí)行的線程對象的public
final
boolean
isAlive()測試線程是否處于活動狀態(tài)public
Thread.State
getState()返回該線程的狀態(tài),返回Thread類的靜態(tài)的 枚舉類型public
final
String
getName()返回該線程的名稱public
final
void
setName(String
name)改變線程名稱public
final
void
setDaemon(boolean
on)將該線程標(biāo)記為守護(hù)( )線程或用戶線程10isAlive()判斷一個子線程是否還“活著”Demo線程睡眠:Thread.sleep(long
millis)throws
InterruptedException
方法,使線程轉(zhuǎn)到阻塞狀態(tài)。millis參數(shù)設(shè)定睡眠的時間,以毫秒為單位。當(dāng)睡眠結(jié)束后,就轉(zhuǎn)為就緒(Runnable)狀態(tài)。線程讓步(禮讓):Thread.yield()靜態(tài)方法,暫停當(dāng)前正在執(zhí)行的線程對象,把執(zhí)行機(jī)會讓給相同或者更高優(yōu)先級的線程。但隨后仍然可能繼續(xù)執(zhí)行.線程加入(合并/加塞):join()
throws
InterruptedException
方法
在當(dāng)前線
調(diào)用另一個線程的
join()方法,則當(dāng)前線程轉(zhuǎn)入WAITING狀態(tài),直到另一個線程運(yùn)行結(jié)束,當(dāng)前線程再由阻塞轉(zhuǎn)為就緒狀態(tài)。12TestThreadYield.javapublic
class
TestThreadYield
{public
static
void
main(String[]
args)
{System.out.println("主線程:"+Thread.currentThread().getName());Thread
thread1=new
Thread(new
MyThread2());thread1.start();Thread
thread2
=new
Thread(new
MyThread2());thread2.start();}}class
MyThread2
implements
Runnable{public
void
run()
{for(int
i
=0;
i
<
100;i++){System.out.println(Thread.currentThread().getName()+
":"
+
i);if(i
%
10
==
0){System.out.println(Thread.currentThread().getName()+“yield”);Thread.yield();/*線程讓步*/
}}}}
13Thread.yieldpublic
class
TestThreadJoin
{public
static
void
main(String[]
args)
{Thread
thread1
=
new
Thread(newMyThread3());thread1.start();for
(int
i=
1;
i
<=100;
i++)
{System.out.println(Thread.currentThread().getName()
+
":"
+
i);if
(i
==
50)
{try{
thread1.join(); //線程合并}
catch
(InterruptedException
e)
{
e.printStackTrace();
}}}}}class
MyThread3
implements
Runnable{public
void
run(){for
(int
i
=
1;i<=50;i++){System.out.println(Thread.currentThread().getName()
+
":"
+
i);try
{
Thread.sleep(100);}
catch
(InterruptedException
e)
{ e.printStackTrac
()
}}}}TestThreadJoin.java14join練習(xí)設(shè)計一個線程類,在main()中創(chuàng)建并啟動2個該類的子線程,一個子線程(“A”)每打印10個數(shù)字睡眠,另一個子線程(“B”)每打印20個睡眠,會用到的方法:Thread(Runnable ,
Stringname)getName()
,sleep()如果線程的run()方法中執(zhí)行的是一個重復(fù)執(zhí)行的循環(huán),可以提供一個標(biāo)記來控制循環(huán)是否繼續(xù)執(zhí)行。示例:TestThreadEnd.java(下頁)對于正在執(zhí)行的線程,interrupt()無法打斷該線程的執(zhí)行,但是可以獲得該線程被中斷的標(biāo)志:Terrupted()得到true,調(diào)用后,中斷標(biāo)志將被清除(變?yōu)閒alse)如果線程因為執(zhí)行join(),sleep()或是wait()而進(jìn)入了阻塞狀態(tài),此時要想停止它,可以使用interrupt(),程序會拋出InterruptedException異常而被catch()子句捕獲,進(jìn)行處理。示例:TestThreadEnd2.java(下頁)如果程序因為輸入/輸出的等待而阻塞,基本上必須等待輸入/輸出的動作完成才能離開阻塞狀態(tài)。無法用interrupt()方法來使得線程離開run()方法,要想離開,只能通過 一個異常。16public
classThreadEndTest
{public
static
void
main(String[]
args)
{SomeThread
some
=newSomeThread();Thread
thread1=
new
Thread(some);thread1.start();try
{Thread.sleep(500);}
catch
(InterruptedException
e)
{
e.printStackTrace();
}some.terimate();}}class
SomeThread
implements
Runnable
{private
boolean
flag=
true;this.flag
=
false;
}public
void
terimate()
{public
void
run()
{while
(flag)
{System.out.println("...run...");}}}TestThreadEnd.java17public
class
TestThreadEnd2
{public
static
void
main(String[]
args)
{Thread
thread1
=
new
Thread(newSomeThread2());thread1.start();try
{Thread.sleep(2000);}
catch
(InterruptedException
e)
{
e.printStackTrace();
}errupt();TestThreadEnd2.java}}class
SomeThread2
implements
Runnable{public
void
run(){System.out.println("sleep.........");try
{Thread.sleep(9999);}
catch
(InterruptedException
e)
{System.out.println("
interrupted...");e.printStackTrace();}}}18線程的狀態(tài):要想實(shí)現(xiàn)多線程,必須在主線
創(chuàng)建新的線程對象。任何線程都具有五種狀態(tài):創(chuàng)建、就緒、運(yùn)行、阻塞、終止(停止)。19新建狀態(tài)(New)新創(chuàng)建了一個線程對象。就緒狀態(tài)(Runnable)線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,變得可運(yùn)行,等待獲取CPU的使用權(quán)。獲取了CPU,執(zhí)行程序代碼時也屬于就緒狀態(tài)。運(yùn)行狀態(tài)(Running)執(zhí)行run()。阻塞狀態(tài)(Blocked)阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運(yùn)行。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會轉(zhuǎn)到運(yùn)行狀態(tài)。阻塞的情況分三種:同步阻塞:若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。運(yùn)行的線程在獲取對象的同步鎖時,其他需要該鎖的線程將進(jìn)入同步阻塞狀態(tài).等待阻塞:運(yùn)行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。其他阻塞:運(yùn)行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。結(jié)束狀態(tài)(Dead)線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周2期0
。Java
提供一個線程調(diào)度器來 程序中啟動后進(jìn)入就緒狀態(tài)的所有線程。優(yōu)先級高的線程會獲得較多的運(yùn)行機(jī)會。Java
線程的優(yōu)先級用整數(shù)表示,取值范圍是1~10,Thread
類有以下三個靜態(tài)常量:static
int
MAX_PRIORITYstatic
intMIN_PRIORITYstatic
intNORM_PRIORITY線程可以具有的最高優(yōu)先級,取值為10。線程可以具有的最低優(yōu)先級,取值為1。分配給線程的默認(rèn)優(yōu)先級,取值為5。Thread類的void
setPriority(int
newPriority)和int
getPriority()方法分別用來設(shè)置和獲取線程的優(yōu)先級。21public
class
TestPriority
{public
static
void
main(String[]
args)
{Thread
t0=
new
Thread(new
R());Thread
t1=
new
Thread(new
R());t0.setPriority(Thread.NORM_PRIORITY
+
5);t0.start();t1.start();}}class
R
implements
Runnable
{public
void
run()
{for
(int
i
=
0;
i
<
100;
i++)
{
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司借款合同范本模板
- 物業(yè)服務(wù)擔(dān)保合同
- 2025年度物業(yè)管理與業(yè)主共同維護(hù)公共設(shè)施合同
- 2025年度紅薯種植與農(nóng)產(chǎn)品品牌建設(shè)合作合同
- 2025年茶樓轉(zhuǎn)讓合同模板:茶樓與茶藝文化交流中心合作轉(zhuǎn)讓協(xié)議
- 二零二五年度家庭自愿撫養(yǎng)權(quán)調(diào)整合同
- 二零二五年度影視后期制作退場結(jié)算管理合同
- 2025年度河邊農(nóng)業(yè)土地經(jīng)營權(quán)保險私人耕種土地承包合同
- 2025年度二零二五年度特色餐飲連鎖加盟經(jīng)營合作協(xié)議書
- 2025年度智能家居系統(tǒng)安裝與維修服務(wù)合同
- 機(jī)構(gòu)編制重要事項的報告范文(5篇)
- DBJ51-T 188-2022 預(yù)拌流態(tài)固化土工程應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 《長津湖》電影賞析PPT
- 多維閱讀第10級 who is who 看看都是誰
- 滑雪運(yùn)動介紹
- 高二下學(xué)期英語閱讀限時訓(xùn)練(一)
- 半導(dǎo)體制造工藝-13薄膜沉積(下)綜述課件
- 大數(shù)據(jù)和人工智能知識考試題庫600題(含答案)
- 2021譯林版高中英語選擇性必修一單詞表
- 幼兒園大班綜合《月亮姑娘做衣裳》微課件
- 顯微外科課件
評論
0/150
提交評論