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