03-線程(一)

[TOC]

1.基本概念

1.1進(jìn)程

操作系統(tǒng)中的獨(dú)立運(yùn)行的程序,每一個(gè)進(jìn)程執(zhí)行都有一個(gè)執(zhí)行順序捐友。一個(gè)進(jìn)程中可以有多個(gè)線程淫半。

1.2 線程

從進(jìn)程創(chuàng)建的,只是進(jìn)程的一部分代碼可以脫離出來(lái)匣砖,與主線程同時(shí)進(jìn)行科吭。

1.3 多線程

多線程是實(shí)現(xiàn)多任務(wù)的一種方式。

1.4并發(fā)

指兩個(gè)或多個(gè)事件在同一時(shí)間段內(nèi)發(fā)生猴鲫。

1.5并行

指兩個(gè)或多個(gè)事件在同一時(shí)刻發(fā)生(同時(shí)發(fā)生)对人。

并發(fā)的關(guān)鍵是你有處理多個(gè)任務(wù)的能力,不一定要同時(shí)拂共。 
并行的關(guān)鍵是你有同時(shí)處理多個(gè)任務(wù)的能力牺弄。  

2.使用多線程的意義

提高執(zhí)行效率

  1. 提高cpu的利用率,在單線程下宜狐,運(yùn)行一個(gè)任務(wù)的時(shí)候势告,第二個(gè)任務(wù)便不能執(zhí)行,而在多線程的下抚恒,主線程執(zhí)行的情況下可以同時(shí)執(zhí)行其他任務(wù)咱台;

  2. 系統(tǒng)創(chuàng)建進(jìn)程需要為該進(jìn)程重新分配系統(tǒng)資源,創(chuàng)建線程代價(jià)比較屑笸浴回溺;

  3. 線程可以共享數(shù)據(jù),而進(jìn)程之間不能共享數(shù)據(jù)混萝;

  4. Java語(yǔ)言內(nèi)置了多線程功能支持遗遵,簡(jiǎn)化了java多線程編程。

3.線程的狀態(tài)

  • 新建 :線程對(duì)象創(chuàng)建譬圣,但是沒(méi)有在其上調(diào)用start()方法瓮恭;
  • 就緒(可運(yùn)行) :線程對(duì)象調(diào)用start()方法后雄坪,就處于就緒狀態(tài)厘熟,但調(diào)度程序還沒(méi)有把它選定為運(yùn)行線程時(shí)線程所處的狀態(tài)屯蹦;
  • 運(yùn)行 :就緒狀態(tài)下的線程在獲取CPU資源后就可以執(zhí)行run(),此時(shí)的線程便處于運(yùn)行狀態(tài),運(yùn)行狀態(tài)的線程可變?yōu)榫途w绳姨、阻塞及死亡三種狀態(tài)登澜。
  • 等待/阻塞/睡眠 :在一個(gè)線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法后會(huì)失去所占有的資源飘庄,從而進(jìn)入阻塞狀態(tài)脑蠕,其共同點(diǎn)是:線程仍舊是活的,但是當(dāng)前沒(méi)有條件運(yùn)行跪削。換句話說(shuō)谴仙,它是可運(yùn)行的,但是如果某件事件出現(xiàn)碾盐,他可能返回到可運(yùn)行狀態(tài)晃跺。
  • 終止 :run()方法完成后或發(fā)生其他終止條件時(shí)就會(huì)切換到終止?fàn)顟B(tài)。

4.創(chuàng)建線程的方法

4.1 繼承Thread類(lèi)

步驟

  1. 定義類(lèi)繼承Thread毫玖;
  2. 重寫(xiě)Thread類(lèi)中的run方法掀虎;
    目的:將自定義代碼存儲(chǔ)在run方法,讓線程運(yùn)行
  3. 調(diào)用線程的start方法
    啟動(dòng)線程付枫,調(diào)用run方法烹玉。
public class MyThread extends Thread{//繼承Thread類(lèi)
  public void run(){
  //重寫(xiě)run方法
  }
}
public class Main {
  public static void main(String[] args){
    new MyThread().start();//創(chuàng)建并啟動(dòng)線程
  }
}

4.2 實(shí)現(xiàn)Runnable接口

步驟

  1. 定義子類(lèi),實(shí)現(xiàn)Runnable接口阐滩,并重寫(xiě)run()二打;
  2. 啟動(dòng)線程,創(chuàng)建Runnable實(shí)現(xiàn)類(lèi)的實(shí)例掂榔,并用這個(gè)實(shí)例作為T(mén)hread的target來(lái)創(chuàng)建Thread對(duì)象址儒;
  3. 通過(guò)調(diào)用線程對(duì)象的start()方法來(lái)啟動(dòng)線程。
public class MyThread2 implements Runnable {//實(shí)現(xiàn)Runnable接口
  public void run(){
  //重寫(xiě)run方法
  }
}
public class Main {
  public static void main(String[] args){
    //創(chuàng)建并啟動(dòng)線程
    MyThread2 myThread=new MyThread2();
    Thread thread=new Thread(myThread);
    thread().start();
    //或者    new Thread(new MyThread2()).start();
  }
}

4.3 使用Callable和Future創(chuàng)建線程

步驟:

  1. 創(chuàng)建Callable接口的實(shí)現(xiàn)類(lèi)衅疙,并實(shí)現(xiàn)call()方法莲趣,然后創(chuàng)建該實(shí)現(xiàn)類(lèi)的實(shí)例(從java8開(kāi)始可以直接使用Lambda表達(dá)式創(chuàng)建Callable對(duì)象)。

  2. 使用FutureTask類(lèi)來(lái)包裝Callable對(duì)象饱溢,該FutureTask對(duì)象封裝了Callable對(duì)象的call()方法的返回值

  3. 使用FutureTask對(duì)象作為T(mén)hread對(duì)象的target創(chuàng)建并啟動(dòng)線程(因?yàn)镕utureTask實(shí)現(xiàn)了Runnable接口)

  4. 調(diào)用FutureTask對(duì)象的get()方法來(lái)獲得子線程執(zhí)行結(jié)束后的返回值

public class Main {
  public static void main(String[] args){
   MyThread3 th=new MyThread3();
   //使用Lambda表達(dá)式創(chuàng)建Callable對(duì)象
     //使用FutureTask類(lèi)來(lái)包裝Callable對(duì)象
   FutureTask<Integer> future=new FutureTask<Integer>(
    (Callable<Integer>)()->{
      return 5;
    }
    );
   new Thread(task,"有返回值的線程").start();//實(shí)質(zhì)上還是以Callable對(duì)象來(lái)創(chuàng)建并啟動(dòng)線程
    try{
    System.out.println("子線程的返回值:"+future.get());//get()方法會(huì)阻塞喧伞,直到子線程執(zhí)行結(jié)束才返回
    }catch(Exception e){
    ex.printStackTrace();
   }
  }
}

4.4 三種創(chuàng)建方式的對(duì)比

  1. 采用實(shí)現(xiàn)Runnable、Callable接口的方式創(chuàng)建多線程時(shí)

優(yōu)勢(shì)是:

線程類(lèi)只是實(shí)現(xiàn)了Runnable接口或Callable接口绩郎,還可以繼承其他類(lèi)潘鲫。

在這種方式下,多個(gè)線程可以共享同一個(gè)target對(duì)象肋杖,所以非常適合多個(gè)相同線程來(lái)處理同一份資源的情況溉仑,從而可以將CPU、代碼和數(shù)據(jù)分開(kāi)状植,形成清晰的模型浊竟,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>

劣勢(shì)是:

編程稍微復(fù)雜怨喘,如果要訪問(wèn)當(dāng)前線程,則必須使用Thread.currentThread()方法振定。

  1. 使用繼承Thread類(lèi)的方式創(chuàng)建多線程時(shí)必怜,

優(yōu)勢(shì)是:

編寫(xiě)簡(jiǎn)單,如果需要訪問(wèn)當(dāng)前線程后频,則無(wú)需使用Thread.currentThread()方法梳庆,直接使用this即可獲得當(dāng)前線程。

劣勢(shì)是:

線程類(lèi)已經(jīng)繼承了Thread類(lèi)卑惜,所以不能再繼承其他父類(lèi)膏执。

  1. Runnable和Callable的區(qū)別

(1) Callable規(guī)定(重寫(xiě))的方法是call(),Runnable規(guī)定(重寫(xiě))的方法是run()露久。

(2) Callable的任務(wù)執(zhí)行后可返回值胧后,而Runnable的任務(wù)是不能返回值的。

(3) call方法可以拋出異常抱环,run方法不可以壳快。

(4) 運(yùn)行Callable任務(wù)可以拿到一個(gè)Future對(duì)象,表示異步計(jì)算的結(jié)果镇草。它提供了檢查計(jì)算是否完成的方法眶痰,以等待計(jì)算的完成,并檢索計(jì)算的結(jié)果梯啤。通過(guò)Future對(duì)象可以了解任務(wù)執(zhí)行情況竖伯,可取消任務(wù)的執(zhí)行,還可獲取執(zhí)行結(jié)果因宇。

注:一般推薦采用實(shí)現(xiàn)接口的方式來(lái)創(chuàng)建多線程

參考:

https://www.cnblogs.com/yjboke/p/8911220.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末七婴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子察滑,更是在濱河造成了極大的恐慌打厘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺辰,死亡現(xiàn)場(chǎng)離奇詭異户盯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饲化,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)莽鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吃靠,你說(shuō)我怎么就攤上這事硫眨。” “怎么了巢块?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我查近,道長(zhǎng),這世上最難降的妖魔是什么裂逐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任歹鱼,我火速辦了婚禮泣栈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弥姻。我一直安慰自己南片,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布庭敦。 她就那樣靜靜地躺著疼进,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秧廉。 梳的紋絲不亂的頭發(fā)上伞广,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音疼电,去河邊找鬼嚼锄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蔽豺,可吹牛的內(nèi)容都是我干的区丑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼修陡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沧侥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起魄鸦,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宴杀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拾因,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婴氮,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年盾致,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了主经。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庭惜,死狀恐怖罩驻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情护赊,我是刑警寧澤惠遏,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布砾跃,位于F島的核電站,受9級(jí)特大地震影響节吮,放射性物質(zhì)發(fā)生泄漏抽高。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一透绩、第九天 我趴在偏房一處隱蔽的房頂上張望翘骂。 院中可真熱鬧,春花似錦帚豪、人聲如沸碳竟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莹桅。三九已至,卻和暖如春烛亦,著一層夾襖步出監(jiān)牢的瞬間诈泼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工煤禽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐达,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓呜师,卻偏偏與公主長(zhǎng)得像娶桦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汁汗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一.線程與進(jìn)程相關(guān) 1.進(jìn)程 ??定義:進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)衷畦,進(jìn)程是操作系統(tǒng)分...
    Geeks_Liu閱讀 1,718評(píng)論 2 4
  • 先看幾個(gè)概念:線程:進(jìn)程中負(fù)責(zé)程序執(zhí)行的執(zhí)行單元祈争。一個(gè)進(jìn)程中至少有一個(gè)線程。多線程:解決多任務(wù)同時(shí)執(zhí)行的需求角寸,合理...
    yeying12321閱讀 543評(píng)論 0 0
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 4,259評(píng)論 2 12
  • 多線程主要技術(shù)進(jìn)程與線程線程狀態(tài)阻塞狀態(tài)分類(lèi)線程的調(diào)度常用函數(shù)說(shuō)明Thread類(lèi)方法創(chuàng)建線程線程池線程安全向線程傳...
    小石頭呢閱讀 1,394評(píng)論 3 15
  • JUC 原創(chuàng)者:文思扁藕,感謝尚硅谷沮峡,資料來(lái)源于尚硅谷 目錄: 1、volatile關(guān)鍵字與內(nèi)存可見(jiàn)性 2亿柑、原子變量與...
    文思li閱讀 2,319評(píng)論 0 1