java 多線程

Java給多線程編程提供了內(nèi)置的支持袱瓮。一個(gè)多線程程序包含兩個(gè)或多個(gè)能并發(fā)運(yùn)行的部分缤骨。程序的每一部分都稱作一個(gè)線程,并且每個(gè)線程定義了一個(gè)獨(dú)立的執(zhí)行路徑尺借。
多線程是多任務(wù)的一種特別的形式绊起。多線程比多任務(wù)需要更小的開銷。
這里定義和線程相關(guān)的另一個(gè)術(shù)語(yǔ):進(jìn)程:一個(gè)進(jìn)程包括由操作系統(tǒng)分配的內(nèi)存空間燎斩,包含一個(gè)或多個(gè)線程虱歪。一個(gè)線程不能獨(dú)立的存在,它必須是進(jìn)程的一部分栅表。一個(gè)進(jìn)程一直運(yùn)行笋鄙,直到所有的非守候線程都結(jié)束運(yùn)行后才能結(jié)束。
多線程能滿足程序員編寫非常有效率的程序來(lái)達(dá)到充分利用CPU的目的怪瓶,因?yàn)镃PU的空閑時(shí)間能夠保持在最低限度萧落。


Paste_Image.png
  • 新狀態(tài): 一個(gè)新產(chǎn)生的線程從新狀態(tài)開始了它的生命周期。它保持這個(gè)狀態(tài)知道程序start這個(gè)線程。
  • 運(yùn)行狀態(tài):當(dāng)一個(gè)新狀態(tài)的線程被start以后铐尚,線程就變成可運(yùn)行狀態(tài)拨脉,一個(gè)線程在此狀態(tài)下被認(rèn)為是開始執(zhí)行其任務(wù)
  • 就緒狀態(tài):當(dāng)一個(gè)線程等待另外一個(gè)線程執(zhí)行一個(gè)任務(wù)的時(shí)候,該線程就進(jìn)入就緒狀態(tài)宣增。當(dāng)另一個(gè)線程給就緒狀態(tài)的線程發(fā)送信號(hào)時(shí)玫膀,該線程才重新切換到運(yùn)行狀態(tài)。
  • 休眠狀態(tài): 由于一個(gè)線程的時(shí)間片用完了爹脾,該線程從運(yùn)行狀態(tài)進(jìn)入休眠狀態(tài)帖旨。當(dāng)時(shí)間間隔到期或者等待的時(shí)間發(fā)生了,該狀態(tài)的線程切換到運(yùn)行狀態(tài)灵妨。
  • **終止?fàn)顟B(tài): **一個(gè)運(yùn)行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生解阅,該線程就切換到終止?fàn)顟B(tài)。

線程的優(yōu)先級(jí)

每一個(gè)Java線程都有一個(gè)優(yōu)先級(jí)泌霍,這樣有助于操作系統(tǒng)確定線程的調(diào)度順序货抄。Java優(yōu)先級(jí)在MIN_PRIORITY(1)和MAX_PRIORITY(10)之間的范圍內(nèi)。默認(rèn)情況下朱转,每一個(gè)線程都會(huì)分配一個(gè)優(yōu)先級(jí)NORM_PRIORITY(5)蟹地。
具有較高優(yōu)先級(jí)的線程對(duì)程序更重要,并且應(yīng)該在低優(yōu)先級(jí)的線程之前分配處理器時(shí)間藤为。然而怪与,線程優(yōu)先級(jí)不能保證線程執(zhí)行的順序,而且非常依賴于平臺(tái)缅疟。


創(chuàng)建一個(gè)線程

Java提供了兩種創(chuàng)建線程方法:
通過實(shí)現(xiàn)Runable接口分别;

// 創(chuàng)建一個(gè)新的線程 通過實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程
class NewThread implements Runnable {
   Thread t;
   NewThread() {
      // 創(chuàng)建第二個(gè)新線程
      // 在創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable接口的類之后,你可以在類中實(shí)例化一個(gè)線程對(duì)象存淫。
      // Thread定義了幾個(gè)構(gòu)造方法耘斩,下面的這個(gè)是我們經(jīng)常使用的:
      t = new Thread(this, "Demo Thread");
      System.out.println("Child thread: " + t);
      // 新線程創(chuàng)建之后,調(diào)用它的start()方法它才會(huì)運(yùn)行
      t.start(); // 開始線程
   }
  
   // 為了實(shí)現(xiàn)Runnable纫雁,一個(gè)類只需要執(zhí)行一個(gè)方法調(diào)用run()煌往,聲明如下: 
   // 第二個(gè)線程入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            // 暫停線程
            Thread.sleep(50);
         }
     } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
     }
     System.out.println("Exiting child thread.");
   }
}
 
public class ThreadDemo {
   public static void main(String args[]) {
      new NewThread(); // 創(chuàng)建一個(gè)新線程
      try {
         for(int i = 5; i > 0; i--) {
           System.out.println("Main Thread: " + i);
           Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}
  • 通過繼承Thread來(lái)創(chuàng)建線程
    創(chuàng)建一個(gè)線程的第二種方法是創(chuàng)建一個(gè)新的類倾哺,該類繼承Thread類轧邪,然后創(chuàng)建一個(gè)該類的實(shí)例。
    繼承類必須重寫run()方法羞海,該方法是新線程的入口點(diǎn)忌愚。它也必須調(diào)用start()方法才能執(zhí)行。
// 通過繼承 Thread 創(chuàng)建線程
class NewThread extends Thread {
   NewThread() {
      // 創(chuàng)建第二個(gè)新線程
      super("Demo Thread");
      System.out.println("Child thread: " + this);
      start(); // 開始線程
   }
 
   // 第二個(gè)線程入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
                            // 讓線程休眠一會(huì)
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
      }
      System.out.println("Exiting child thread.");
   }
}
 
public class ExtendThread {
   public static void main(String args[]) {
      new NewThread(); // 創(chuàng)建一個(gè)新線程
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}
Paste_Image.png
Paste_Image.png
線程的幾個(gè)主要概念
  • 在多線程編程時(shí)却邓,你需要了解以下幾個(gè)概念:
  • 線程同步
  • 線程間通信
  • 線程死鎖
  • 線程控制:掛起硕糊、停止和恢復(fù)

[JAVA 多線程和并發(fā)基礎(chǔ)面試問答]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子简十,更是在濱河造成了極大的恐慌檬某,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟蝙,死亡現(xiàn)場(chǎng)離奇詭異恢恼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)胰默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門场斑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人牵署,你說(shuō)我怎么就攤上這事漏隐。” “怎么了奴迅?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵青责,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我取具,道長(zhǎng)爽柒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任者填,我火速辦了婚禮浩村,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘占哟。我一直安慰自己心墅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布榨乎。 她就那樣靜靜地躺著怎燥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜜暑。 梳的紋絲不亂的頭發(fā)上铐姚,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音肛捍,去河邊找鬼隐绵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拙毫,可吹牛的內(nèi)容都是我干的依许。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缀蹄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峭跳!你這毒婦竟也來(lái)了膘婶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛀醉,失蹤者是張志新(化名)和其女友劉穎悬襟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯刁,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡古胆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筛璧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逸绎。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夭谤,靈堂內(nèi)的尸體忽然破棺而出棺牧,到底是詐尸還是另有隱情,我是刑警寧澤朗儒,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布颊乘,位于F島的核電站,受9級(jí)特大地震影響醉锄,放射性物質(zhì)發(fā)生泄漏乏悄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一恳不、第九天 我趴在偏房一處隱蔽的房頂上張望檩小。 院中可真熱鬧,春花似錦烟勋、人聲如沸规求。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阻肿。三九已至,卻和暖如春沮尿,著一層夾襖步出監(jiān)牢的瞬間丛塌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工畜疾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴邻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓庸疾,卻偏偏與公主長(zhǎng)得像乍楚,于是被迫代替她去往敵國(guó)和親当编。 傳聞我的和親對(duì)象是個(gè)殘疾皇子届慈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評(píng)論 1 18
  • 本文主要講了java中多線程的使用方法徒溪、線程同步、線程數(shù)據(jù)傳遞金顿、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法臊泌、概述等。 首先講...
    李欣陽(yáng)閱讀 2,454評(píng)論 1 15
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來(lái)依藍(lán)閱讀 7,353評(píng)論 3 87
  • 一揍拆、認(rèn)識(shí)多任務(wù)渠概、多進(jìn)程、單線程嫂拴、多線程 要認(rèn)識(shí)多線程就要從操作系統(tǒng)的原理說(shuō)起播揪。 以前古老的DOS操作系統(tǒng)(V 6....
    GT921閱讀 1,013評(píng)論 0 3
  • 線程概述 線程與進(jìn)程 進(jìn)程 ?每個(gè)運(yùn)行中的任務(wù)(通常是程序)就是一個(gè)進(jìn)程。當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí)筒狠,即變成了一個(gè)進(jìn)...
    閩越布衣閱讀 1,009評(píng)論 1 7