java文件-千鋒多線程_第1頁
java文件-千鋒多線程_第2頁
java文件-千鋒多線程_第3頁
java文件-千鋒多線程_第4頁
java文件-千鋒多線程_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論