大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java多線程教程之基礎知識講解

Java多線程教程之基礎知識講解

更新時間:2020-06-05 15:46:51 來源:動力節(jié)點 瀏覽2147次

Java多線程教程,Java支持多線程編程,因此用Java編寫的應用程序可以同時執(zhí)行多個任務。Java的多線程機制使用起來非常方便,用戶只需關注程序細節(jié)的實現,而不用擔心后臺的多任務系統。本文將為大家講解有關Java多線程的基礎知識,主要內容有多線程的概念、創(chuàng)建、優(yōu)勢和生命周期。

Java多線程教程之基礎知識講解

什么是多線程

在早期的計算機中時沒有操作系統的,計算機開啟后只能執(zhí)行一個程序,直到結束。操作系統的出現使得計算機可以同時執(zhí)行多個程序,操作系統為每個程序分配不同的進程,每個進程擁有獨立的句柄、資源等,使得計算機可以同時執(zhí)行多個程序。但是進程的創(chuàng)建和銷毀耗費的代價太大,因此衍生出線程的概念。允許在一個進程中創(chuàng)建多個線程,這些線程共享進程的資源,并且每個線程擁有自己獨立的程序計數器、線程局部變量等資源。線程也被稱為進程的輕量型運動實體。

創(chuàng)建多線程和啟動

1.繼承Thread類創(chuàng)建線程類

通過繼承Thread類創(chuàng)建線程類的具體步驟和具體代碼如下:

定義一個繼承Thread類的子類,并重寫該類的run()方法;

創(chuàng)建Thread子類的實例,即創(chuàng)建了線程對象;

調用該線程對象的start()方法啟動線程。

class SomeThead extends Thraad{
public void run(){
//do something here
}
}

public static void main(String[]args){
SomeThread oneThread=new SomeThread();

步驟3:啟動多線程:

oneThread.start();
}

2.實現Runnable接口創(chuàng)建線程類

通過實現Runnable接口創(chuàng)建線程類的具體步驟和具體代碼如下:

定義Runnable接口的實現類,并重寫該接口的run()方法;

創(chuàng)建Runnable實現類的實例,并以此實例作為Thread的target對象,即該Thread對象才是真正的線程對象。

class SomeRunnable implements Runnable{
public void run(){
//do something here
}
}

Runnable oneRunnable=new SomeRunnable();
Thread oneThread=new Thread(oneRunnable);
oneThread.start();

3.通過Callable和Future創(chuàng)建線程

通過Callable和Future創(chuàng)建線程的具體步驟和具體代碼如下:

創(chuàng)建Callable接口的實現類,并實現call()方法,該call()方法將作為線程執(zhí)行體,并且有返回值。

創(chuàng)建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。

使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程。

調用FutureTask對象的get()方法來獲得子線程執(zhí)行結束后的返回值其中,Callable接口(也只有一個方法)定義如下:

public interface Callable{
V call()throws Exception;
}

步驟1:創(chuàng)建實現Callable接口的類SomeCallable(略);

步驟2:創(chuàng)建一個類對象:

Callable oneCallable=new SomeCallable();

步驟3:由Callable創(chuàng)建一個FutureTask對象:

FutureTask oneTask=new FutureTask(oneCallable);

注釋:FutureTask是一個包裝器,它通過接受Callable來創(chuàng)建,它同時實現了Future和Runnable接口。

步驟4:由FutureTask創(chuàng)建一個Thread對象:

Thread oneThread=new Thread(oneTask);

步驟5:啟動線程:

oneThread.start();

多線程的優(yōu)勢

多線程的出現帶來很多的好處:

  • 發(fā)揮多核處理器的性能:在多喝處理器上執(zhí)行單線程任務是對多核的浪費,因為總有核心在空閑著,多線程的出現能充分發(fā)揮多核的優(yōu)勢。
  • 化整為零:往往在一個復雜的應用中包含許多不同類型的任務,將這些不同類型的任務分配給不同的線程去執(zhí)行會比將其混在同一個線程中去執(zhí)行要好,因為每個線程更加的簡單清晰,更容易測試等。
  • 異步事件處理:當一個線程處理的任務遇到阻塞時如IO阻塞,cpu可以調度其他線程去執(zhí)行而不是在那傻傻的等到IO結束在執(zhí)行其他任務。
  • 更好的用戶體驗:當多個用戶像你的服務發(fā)送請求時,你一個線程依次執(zhí)行任務會使得排在后面的用戶等待時間過長得不到響應,帶來不好的體驗。但使用多個線程可以讓每個用戶都能很快的得到響應(盡管這不能高執(zhí)行速度),用戶會覺得自己的請求正在被處理,獲得更好的體驗。

多線程的生命周期

1.新建狀態(tài)

用new關鍵字和Thread類或其子類建立一個線程對象后,該線程對象就處于新生狀態(tài)。處于新生狀態(tài)的線程有自己的內存空間,通過調用start方法進入就緒狀態(tài)(runnable)。

注意:不能對已經啟動的線程再次調用start()方法,否則會出現Java.lang.IllegalThreadStateException異常。

2.就緒狀態(tài)

處于就緒狀態(tài)的線程已經具備了運行條件,但還沒有分配到CPU,處于線程就緒隊列(盡管是采用隊列形式,事實上,把它稱為可運行池而不是可運行隊列。因為cpu的調度不一定是按照先進先出的順序來調度的),等待系統為其分配CPU。等待狀態(tài)并不是執(zhí)行狀態(tài),當系統選定一個等待執(zhí)行的Thread對象后,它就會從等待執(zhí)行狀態(tài)進入執(zhí)行狀態(tài),系統挑選的動作稱之為“cpu調度”。一旦獲得CPU,線程就進入運行狀態(tài)并自動調用自己的run方法。

提示:如果希望子線程調用start()方法后立即執(zhí)行,可以使用Thread.sleep()方式使主線程睡眠一伙兒,轉去執(zhí)行子線程。

3.運行狀態(tài)

處于運行狀態(tài)的線程最為復雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。

處于就緒狀態(tài)的線程,如果獲得了cpu的調度,就會從就緒狀態(tài)變?yōu)檫\行狀態(tài),執(zhí)行run()方法中的任務。如果該線程失去了cpu資源,就會又從運行狀態(tài)變?yōu)榫途w狀態(tài)。重新等待系統分配資源。也可以對在運行狀態(tài)的線程調用yield()方法,它就會讓出cpu資源,再次變?yōu)榫途w狀態(tài)。

注:當發(fā)生如下情況是,線程會從運行狀態(tài)變?yōu)樽枞麪顟B(tài):

①線程調用sleep方法主動放棄所占用的系統資源

②線程調用一個阻塞式IO方法,在該方法返回之前,該線程被阻塞

③線程試圖獲得一個同步監(jiān)視器,但更改同步監(jiān)視器正被其他線程所持有

④線程在等待某個通知(notify)

⑤程序調用了線程的suspend方法將線程掛起。不過該方法容易導致死鎖,所以程序應該盡量避免使用該方法。

當線程的run()方法執(zhí)行完,或者被強制性地終止,例如出現異常,或者調用了stop()、desyory()方法等等,就會從運行狀態(tài)轉變?yōu)樗劳鰻顟B(tài)。

4.阻塞狀態(tài)

處于運行狀態(tài)的線程在某些情況下,如執(zhí)行了sleep(睡眠)方法,或等待I/O設備等資源,將讓出CPU并暫時停止自己的運行,進入阻塞狀態(tài)。在阻塞狀態(tài)的線程不能進入就緒隊列。只有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O設備空閑下來,線程便轉入就緒狀態(tài),重新到就緒隊列中排隊等待,被系統選中后從原來停止的位置開始繼續(xù)運行。有三種方法可以暫停Threads執(zhí)行:

5.死亡狀態(tài)

當線程的run()方法執(zhí)行完,或者被強制性地終止,就認為它死去。這個線程對象也許是活的,但是,它已經不是一個單獨執(zhí)行的線程。線程一旦死亡,就不能復生。如果在一個死去的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常。

Java多線程教程之基礎知識講解

以上就是動力節(jié)點java培訓機構的小編針對“Java多線程教程之基礎知識講解”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 伊人网狠狠干 | 91在线免费公开视频 | 国产精品一级视频 | 亚洲一区在线视频观看 | 伊人精品在线 | 欧美日韩中文字幕在线 | 亚洲夜色综合久久 | 国产女主播喷出白浆视频 | 日韩欧美国产卡通动漫 | 欧美一级日本一级韩国一级 | 亚洲一二区 | 青青久久精品国产免费看 | 成人黄18免费视频 | 97se亚洲国产综合自在线观看 | 色老板女色狠xx网 | 国产福利精品视频 | 中文字幕免费 | 99视频在线精品免费观看18 | 四虎网址| 国产成人在线免费观看 | 997在线观看视频国产 | 久热996re这里有精品 | 天天射天天 | 天天玩夜夜操 | 免费一级欧美片在线观看 | jiucao在线观看精品 | 一区二区三区在线视频播放 | 欧美深夜影院 | 日韩在线一区二区三区视频 | 四虎影音在线 | 欧美精品一区二区三区在线 | 国产精品夜色视频一区二区 | 色偷偷免费视频 | 免费区欧美一级毛片精品 | 久久官网| 午夜主播国产福利视频在线 | 欧美午夜艳片欧美精品 | 99热这里只有精品在线 | 中文字幕在线亚洲精品 | 日韩精品国产自在久久现线拍 | 精品国产一区二区三区久久影院 |