Java多線(xiàn)程技術(shù) 多線(xiàn)程模式是什么
發(fā)布時(shí)間:2020-02-16 來(lái)源: 日記大全 點(diǎn)擊:
摘要:本文首先介紹了線(xiàn)程的有關(guān)概念, 接著介紹了線(xiàn)程的生命期及其狀態(tài)間的轉(zhuǎn)換, 多線(xiàn)程的調(diào)度原則, 線(xiàn)程的死鎖, 詳細(xì)闡述了多線(xiàn)程的兩種實(shí)現(xiàn)方法:由Thread類(lèi)派生子類(lèi);實(shí)現(xiàn)Runnable接口。
關(guān)鍵詞:Java語(yǔ)言; 進(jìn)程; 多線(xiàn)程;線(xiàn)程調(diào)度;死鎖
中圖分類(lèi)號(hào):TP312JA 文獻(xiàn)標(biāo)識(shí)碼:A
1 引言
多線(xiàn)程編程是Java語(yǔ)言的一個(gè)重要特色,Java對(duì)創(chuàng)建多線(xiàn)程程序提供了廣泛的支持,Java的多線(xiàn)程是一個(gè)類(lèi)或程序執(zhí)行和管理多個(gè)線(xiàn)程的能力,每個(gè)執(zhí)行線(xiàn)程可獨(dú)立執(zhí)行其他線(xiàn)程或與其他線(xiàn)程同步執(zhí)行。Java的多線(xiàn)程機(jī)制能夠很方便地創(chuàng)建和運(yùn)行多個(gè)獨(dú)立的線(xiàn)程的程序,并且可以創(chuàng)建多個(gè)同步線(xiàn)程,實(shí)現(xiàn)多個(gè)任務(wù)的同步執(zhí)行,這一機(jī)制對(duì)于實(shí)現(xiàn)資源共享、防止“死鎖”現(xiàn)象的出現(xiàn)極為有用。多線(xiàn)程的程序能更好地表達(dá)和解決具體問(wèn)題,是計(jì)算機(jī)應(yīng)用開(kāi)發(fā)和程序?qū)崿F(xiàn)的發(fā)展趨勢(shì)。
2 Java語(yǔ)言的線(xiàn)程
2.1線(xiàn)程相關(guān)的概念
程序是解決某一問(wèn)題的代碼系列,是一段靜態(tài)的代碼。進(jìn)程是一個(gè)動(dòng)態(tài)的概念,它是程序的一次動(dòng)態(tài)執(zhí)行過(guò)程,對(duì)應(yīng)代碼從加載、運(yùn)行開(kāi)始到運(yùn)行完畢的一個(gè)完整的過(guò)程,這個(gè)過(guò)程是進(jìn)程從產(chǎn)生、發(fā)展到消亡的過(guò)程。線(xiàn)程又稱(chēng)為“輕量進(jìn)程”,是進(jìn)程中一個(gè)順序的執(zhí)行流,一個(gè)進(jìn)程在其執(zhí)行的過(guò)程中,可以形成多個(gè)執(zhí)行線(xiàn)索,每個(gè)執(zhí)行線(xiàn)索就是一個(gè)線(xiàn)程。線(xiàn)程也是一個(gè)動(dòng)態(tài)的概念,它對(duì)應(yīng)一個(gè)程序段的一次動(dòng)態(tài)的執(zhí)行過(guò)程。一個(gè)進(jìn)程中可以包含一個(gè)或多個(gè)線(xiàn)程,線(xiàn)程是比進(jìn)程更小的單元。
多線(xiàn)程指的是在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線(xiàn)程,即一個(gè)程序中包含有多個(gè)執(zhí)行流,借以執(zhí)行不同的任務(wù)。
雖然線(xiàn)程與進(jìn)程都是順序執(zhí)行的指令序列,但它們之間是有區(qū)別的。一方面,進(jìn)程是一個(gè)實(shí)體,每個(gè)進(jìn)程都有自己獨(dú)立的狀態(tài),并有自己的專(zhuān)用數(shù)據(jù)段;創(chuàng)建進(jìn)程時(shí),必須建立和復(fù)制其專(zhuān)用數(shù)據(jù)段。而線(xiàn)程則相互共享數(shù)據(jù)段,同一程序中的所有線(xiàn)程只有一個(gè)數(shù)據(jù)段,以避免進(jìn)行無(wú)謂的數(shù)據(jù)復(fù)制,因此線(xiàn)程的建立和線(xiàn)程間的切換速度大大優(yōu)于進(jìn)程。另一方面,線(xiàn)程又具備進(jìn)程的大多數(shù)優(yōu)點(diǎn)。但是,由于多個(gè)線(xiàn)程共享一個(gè)數(shù)據(jù)段,所以,也出現(xiàn)了數(shù)據(jù)訪(fǎng)問(wèn)過(guò)程的互斥和同步問(wèn)題,使得系統(tǒng)管理功能變得相對(duì)復(fù)雜。
將進(jìn)程劃分成多個(gè)線(xiàn)程,目的是為了實(shí)現(xiàn)并行程序設(shè)計(jì),在同一地址空間中執(zhí)行多個(gè)控制流,減少并行執(zhí)行時(shí)進(jìn)程間切換的系統(tǒng)開(kāi)銷(xiāo),因此可以大大提高應(yīng)用程序的執(zhí)行效率。
2.2線(xiàn)程的生命期與狀態(tài)轉(zhuǎn)換
線(xiàn)程同進(jìn)程一樣,是一個(gè)動(dòng)態(tài)的概念,所以線(xiàn)程同進(jìn)程一樣,也有一個(gè)從產(chǎn)生到消亡的生命周期,在其生命周期中,程序可以對(duì)線(xiàn)程進(jìn)行各種控制操作。一個(gè)新建的線(xiàn)程的生命期中有如下5種狀態(tài)。
。1)新建態(tài)(Newborn)
當(dāng)線(xiàn)程用new運(yùn)算符創(chuàng)建但還未執(zhí)行的這段時(shí)間里,它處于新建狀態(tài)中,此時(shí),線(xiàn)程對(duì)象已被分配了相應(yīng)的內(nèi)存空間并被初始化。
創(chuàng)建線(xiàn)程的語(yǔ)句可以表示如下:Threaadt1=newThread( );
。2)就緒狀態(tài)或可運(yùn)行狀態(tài)(Runnable)
當(dāng)新建的線(xiàn)程調(diào)用start( )啟動(dòng)方法后,就會(huì)由新建態(tài)進(jìn)入可運(yùn)行態(tài)?蛇\(yùn)行態(tài)的線(xiàn)程進(jìn)入線(xiàn)程隊(duì)列排隊(duì)等待CPU資源,隨時(shí)可以被調(diào)度執(zhí)行。至于可運(yùn)行態(tài)的線(xiàn)程何時(shí)才被真正執(zhí)行,則取決于線(xiàn)程的優(yōu)先級(jí)和排隊(duì)隊(duì)列的當(dāng)前狀況。
使線(xiàn)程對(duì)象t1由新建態(tài)進(jìn)入可運(yùn)行態(tài)的語(yǔ)句可以表示如下:
t1.start( );
。3)運(yùn)行態(tài)(Running)
當(dāng)可運(yùn)行的線(xiàn)程被CPU調(diào)度后,就進(jìn)入運(yùn)行態(tài),運(yùn)行態(tài)表明線(xiàn)程正在運(yùn)行,即線(xiàn)程對(duì)象正在調(diào)用本對(duì)象的run( )方法。
。4)掛起態(tài)(Blocked)
一個(gè)正在運(yùn)行的線(xiàn)程遇到某些特殊情況時(shí),將會(huì)進(jìn)入掛起態(tài)。如果一個(gè)線(xiàn)程處于掛起狀態(tài),這個(gè)線(xiàn)程暫時(shí)無(wú)法進(jìn)入排隊(duì)隊(duì)列。
。5)消亡態(tài)(Dead)
表示線(xiàn)程已退出運(yùn)行狀態(tài),不再具有繼續(xù)運(yùn)行的能力。線(xiàn)程消亡的原因有兩種: 一是線(xiàn)程正常運(yùn)行終止, 即調(diào)用完run( )方法自然消亡: 二是非正常消亡, 例如執(zhí)行了stop( )方法或destory()方法。
2.3線(xiàn)程的優(yōu)先級(jí)與調(diào)度
Java 提供一個(gè)線(xiàn)程調(diào)度器來(lái)監(jiān)控啟動(dòng)后進(jìn)入就緒狀態(tài)的所有線(xiàn)程。線(xiàn)程調(diào)度器根據(jù)線(xiàn)程的優(yōu)先級(jí)決定調(diào)度線(xiàn)程的先后順序,優(yōu)先級(jí)高的線(xiàn)程先調(diào)度,優(yōu)先級(jí)低的線(xiàn)程后調(diào)度。同時(shí),線(xiàn)程的調(diào)度又是搶先式的,如果在當(dāng)前線(xiàn)程的執(zhí)行過(guò)程中,一個(gè)具有更高優(yōu)先級(jí)的線(xiàn)程進(jìn)入就緒狀態(tài),則這個(gè)高優(yōu)先級(jí)的線(xiàn)程將立即被調(diào)度執(zhí)行。
線(xiàn)程的優(yōu)先級(jí)的范圍是1~10,Thread類(lèi)用3個(gè)常量來(lái)表示線(xiàn)程的優(yōu)先級(jí),分別為:Thread.MIN_PRIORITY, 優(yōu)先級(jí)為1,Thread.MAX_PRIORITY, 優(yōu)先級(jí)為10,Thread.NORM_PRIORITY, 即為缺省優(yōu)先級(jí)5,通過(guò)setPriority( )方法可以改變線(xiàn)程的優(yōu)先級(jí)。
3 Java多線(xiàn)程的實(shí)現(xiàn)
在Java中,多線(xiàn)程的實(shí)現(xiàn)方式有兩種:可以由線(xiàn)程Thread類(lèi)派生子類(lèi),由子類(lèi)生成的對(duì)象來(lái)實(shí)現(xiàn)多線(xiàn)程;也可以直接定義一個(gè)線(xiàn)程類(lèi)來(lái)實(shí)現(xiàn)Runnable接口,由該線(xiàn)程類(lèi)生成對(duì)象來(lái)實(shí)現(xiàn)多線(xiàn)程。下面分別介紹兩種方法實(shí)現(xiàn)多線(xiàn)程的過(guò)程。
3.1由Thread類(lèi)派生子類(lèi)
Thread是一個(gè)具體的類(lèi),它封裝了線(xiàn)程的所有行為。Thread類(lèi)負(fù)責(zé)向其他類(lèi)提供線(xiàn)程的最主要的功能,為了向一個(gè)類(lèi)增加線(xiàn)程功能,可以由Thread類(lèi)派生一個(gè)子類(lèi)并同時(shí)覆蓋run( )方法。run( )方法是是線(xiàn)程執(zhí)行的起點(diǎn),可以通過(guò)定義run( )方法來(lái)為線(xiàn)程提供代碼。
下面的程序由Thread類(lèi)來(lái)構(gòu)造多線(xiàn)程。
classThreadExample
{public static void main(String args[])
{subThreadt1=newsubThread(“thread1”);//創(chuàng)建線(xiàn)程對(duì)象
subThreadt2=newsubThread(“thread2”);
t1.start( ); //啟動(dòng)線(xiàn)程
t2.start( );
try{ Thread.currentThread( ).sleep(500); //當(dāng)前線(xiàn)程睡眠500毫秒
}
catch(InterruptedExceptione)
{System.out.println(Thread.currentThread( ) +“線(xiàn)程睡眠500毫秒”); }
}
}
classsubThreadextends Thread
{public voidrun( )
{for(int j=0;j 實(shí)現(xiàn)Runnable接口是在程序中使用線(xiàn)程的另一種方法。在某些情況下,一個(gè)類(lèi)已經(jīng)擴(kuò)展了Frame或Applet, 因而這樣的類(lèi)不能再繼承Thread類(lèi)。Runnable接口為一個(gè)類(lèi)提供了一種無(wú)須擴(kuò)展Thread類(lèi)就可以執(zhí)行一個(gè)新的線(xiàn)程的方法。這種創(chuàng)建線(xiàn)程的方法更具靈活性,也使用戶(hù)線(xiàn)程能夠具有其他的一些類(lèi)的特征。
Runnable接口是定義在java.lang包中的一個(gè)接口,其聲明如下:
publicinterfacejava.lang.Runnable
{public abstract void run( );}
下面的程序由實(shí)現(xiàn)Runnable接口來(lái)構(gòu)造多線(xiàn)程。
publicclassThreadExample2implementsRunnable
{ ThreadExample2 ( )//構(gòu)造方法
{Threadt1=Thread.currentThread( ); //創(chuàng)建線(xiàn)程t1
t1.setName(“The first main thread”);
t1.start( ); //啟動(dòng)線(xiàn)程t1
System.out.println(“The running thread:”+Thread1 );
Threadt2=new Thread(this,“the second thread”); //創(chuàng)建線(xiàn)程t2
System.out.println(“creat another thread”);
t2.start();////啟動(dòng)線(xiàn)程t2
}
public void run( )
{try{
for(int i=0;i
相關(guān)熱詞搜索:多線(xiàn)程 技術(shù) Java Java多線(xiàn)程技術(shù) java多線(xiàn)程與高并發(fā) java多線(xiàn)程編程
熱點(diǎn)文章閱讀