Java-線程

1.什么是線程

在并發(fā)編程中蓝丙,有兩個基本的執(zhí)行單元:進(jìn)程和線程。在Java編程語言中望拖,并發(fā)編程主要關(guān)注線程渺尘。

線程有時稱為輕量級進(jìn)程。進(jìn)程和線程都提供了一個執(zhí)行環(huán)境靠娱,但創(chuàng)建一個新線程所需的資源要少于創(chuàng)建新進(jìn)程的資源沧烈。

線程存在于一個進(jìn)程中, 每個進(jìn)程至少有一個線程像云。線程共享進(jìn)程的資源锌雀,包括內(nèi)存和打開的文件。這使得溝通有效但可能有問題迅诬。

2.線程生命周期

  1. 新建狀態(tài)(New):新創(chuàng)建了一個線程對象腋逆。
  2. 就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法侈贷。該狀態(tài)的線程位于可運行線程池中惩歉,變得可運行,等待獲取CPU的使用權(quán)俏蛮。
  3. 運行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU撑蚌,執(zhí)行程序代碼。
  4. 阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán)搏屑,暫時停止運行争涌。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會轉(zhuǎn)到運行狀態(tài)辣恋。阻塞的情況分三種:
    (一). 等待阻塞:運行的線程執(zhí)行wait()方法亮垫,JVM會把該線程放入等待池中。(wait會釋放持有的鎖)
    (二). 同步阻塞:運行的線程在獲取對象的同步鎖時伟骨,若該同步鎖被別的線程占用饮潦,則JVM會把該線程放入鎖池中。
    (三). 其他阻塞:運行的線程執(zhí)行sleep()或join()方法携狭,或者發(fā)出了I/O請求時继蜡,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時稀并、或者I/O處理完畢時鲫剿,線程重新轉(zhuǎn)入就緒狀態(tài)。(注意,sleep是不會釋放持有的鎖)
  5. 死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法稻轨,該線程結(jié)束生命周期。

3.定義和啟動線程

定義線程有兩種方式:

  • 實現(xiàn)Runnable接口
  • 繼承Thread類
//實現(xiàn)Runnable接口
public class RunnableImpl implements Runnable {

    @Override
    public void run() {
        System.out.println("測試");
    }

    public static void main(String[] args) {
        new Thread(new RunnableImpl()).start();
    }

}

//繼承Thread類
public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println("測試");
    }

    public static void main(String[] args) {
        new ThreadTest().start();
    }

}

啟動線程都是通過調(diào)用Thread.start方法

4.sleep

提供了兩種sleep:

  • 指定休眠時間為毫秒(sleep(long millis))
  • 指定休眠時間為毫秒+納秒(sleep(long millis, int nanos))

注意:這些睡眠時間并不能保證準(zhǔn)確雕凹,因為它們受底層操作系統(tǒng)提供的設(shè)施的限制殴俱。

5.interrupt

一個中斷是指示線程它應(yīng)該終止它在做什么和做別的事情。由程序員來決定線程是如何響應(yīng)中斷的枚抵,但線程終止是非常常見的线欲。

線程通過interrupt在Thread對象上調(diào)用中斷線程來發(fā)送中斷。為使中斷機(jī)制正常工作汽摹,被中斷的線程必須支持自己的中斷李丰。

中斷狀態(tài)標(biāo)志
中斷機(jī)制通過一個稱為中斷狀態(tài)的內(nèi)部標(biāo)志來實現(xiàn)。調(diào)用Thread.interrupt設(shè)置此標(biāo)志逼泣。當(dāng)線程通過調(diào)用靜態(tài)方法檢查中斷時Thread.interrupted趴泌,中斷狀態(tài)被清除。isInterrupted一個線程用于查詢另一個線程的中斷狀態(tài)的非靜態(tài)方法不會更改中斷狀態(tài)標(biāo)志拉庶。

支持中斷
支持中斷的方式:

  • 在捕獲異常后return
  • 定期判斷是否中斷嗜憔,是,就return或拋出中斷異常氏仗,然后通過調(diào)用interrupt發(fā)送中斷
try {
  Thread.sleep(1000);
} catch (InterruptedException e) {
  System.out.println("線程中斷");
  return;
}

if(Thread.interrupted()){
  System.out.println("線程中斷");
  return;
}

if(Thread.interrupted()){
  System.out.println("線程中斷");
  throw new InterruptedException();
}

6.join

線程A調(diào)用join方法時吉捶,會導(dǎo)致當(dāng)前線程(也就是創(chuàng)建線程A所在的線程)暫停執(zhí)行,直到線程A終止皆尔。

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(this.getName()+"加入");
        for (int i = 0; i < 4; i++) {
            try {
                Thread.sleep(1000);
                System.out.println(this.getName()+"執(zhí)行");
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("異常");
            }
        }
        System.out.println(this.getName()+"結(jié)束");
    }
    
    public ThreadTest(String name) {
        super(name);
    }


    public static void main(String[] args) {
        System.out.println("主線程執(zhí)行");
        ThreadTest t = new ThreadTest("猴子");
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主線程結(jié)束");
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呐舔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慷蠕,更是在濱河造成了極大的恐慌珊拼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌们,死亡現(xiàn)場離奇詭異杆麸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浪感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門昔头,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人影兽,你說我怎么就攤上這事揭斧。” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵讹开,是天一觀的道長盅视。 經(jīng)常有香客問我,道長旦万,這世上最難降的妖魔是什么闹击? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮成艘,結(jié)果婚禮上赏半,老公的妹妹穿的比我還像新娘。我一直安慰自己淆两,他們只是感情好断箫,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秋冰,像睡著了一般仲义。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剑勾,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天埃撵,我揣著相機(jī)與錄音,去河邊找鬼甥材。 笑死盯另,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洲赵。 我是一名探鬼主播鸳惯,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叠萍!你這毒婦竟也來了芝发?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤苛谷,失蹤者是張志新(化名)和其女友劉穎辅鲸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腹殿,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡独悴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锣尉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻炒。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖自沧,靈堂內(nèi)的尸體忽然破棺而出坟奥,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布爱谁,位于F島的核電站晒喷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏访敌。R本人自食惡果不足惜凉敲,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寺旺。 院中可真熱鬧荡陷,春花似錦、人聲如沸迅涮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮姑。三九已至,卻和暖如春据悔,著一層夾襖步出監(jiān)牢的瞬間传透,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工极颓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留朱盐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓菠隆,卻偏偏與公主長得像兵琳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骇径,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 【JAVA 線程】 線程 進(jìn)程:是一個正在執(zhí)行中的程序躯肌。每一個進(jìn)程執(zhí)行都有一個執(zhí)行順序。該順序是一個執(zhí)行路徑破衔,或者...
    Rtia閱讀 2,758評論 2 20
  • 下面是我自己收集整理的Java線程相關(guān)的面試題清女,可以用它來好好準(zhǔn)備面試。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,738評論 14 507
  • Java中的線程(多線程)晰筛,本篇主要講一下線程的概念和基本操作以及各個方法的用法等嫡丙;首先在了解線程前我們必須應(yīng)該知...
    星星_點燈閱讀 366評論 0 0
  • 前言:雖然自己平時都在用多線程,也能完成基本的工作需求读第,但總覺得曙博,還是對線程沒有一個系統(tǒng)的概念,所以卦方,查閱了一些資...
    justCode_閱讀 700評論 0 9
  • 初識機(jī)器學(xué)習(xí): 課時一: 機(jī)器學(xué)習(xí)的應(yīng)用領(lǐng)域1.點擊數(shù)據(jù)流量羊瘩,醫(yī)療記錄,人類基因組,工程學(xué)系尘吗。2.無法手動編寫的程...
    向布谷鳥說早安閱讀 265評論 0 0