Java Thread概述

線程生命周期

Threadlife_20170208.jpg

線程狀態(tài):

  • 新建狀態(tài):使用new關(guān)鍵字和Thread類或其子類建立一個(gè)線程對(duì)象后
  • 就緒狀態(tài):當(dāng)線程對(duì)象調(diào)用了start()方法之后,該線程進(jìn)入就緒狀態(tài)
  • 運(yùn)行狀態(tài):如果就緒狀態(tài)的線程獲取CPU資源掉房,就可以執(zhí)行run()
  • 阻塞狀態(tài):
    • 等待阻塞:運(yùn)行狀態(tài)中的線程執(zhí)行wait()方法
    • 同步阻塞:線程在獲取 synchronized 同步鎖失敗
    • 其他阻塞:通過調(diào)用線程的sleep()或join()發(fā)出I/O請(qǐng)求時(shí)
  • 死亡狀態(tài):一個(gè)運(yùn)行狀態(tài)的線程完成人文或者其他終止條件發(fā)送

創(chuàng)建線程

1终息、繼承Thread類

class ThreadDemo extends Thread

2煤率、實(shí)現(xiàn)Runable接口

public class RunTest implements Runnable
   
Thread thread1 = new Thread(new RunTest());

3、通過Callable、Future稿壁、FutureTask創(chuàng)建線程

// 繼承實(shí)現(xiàn)Callable接口,聲明返回類型
class CallTest implements Callable<Long> 
    
FutureTask<Long> futureTask = new FutureTask<Long>(new CallTest(searchVo));

線程內(nèi)置方法

1奥秆、sleep:使當(dāng)前線程(即調(diào)用該方法的線程)暫停執(zhí)行一段時(shí)間逊彭,讓其它線程有機(jī)會(huì)繼續(xù)執(zhí)行,但它不會(huì)釋放對(duì)象鎖构订。
2侮叮、yield:暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并執(zhí)行其他線程悼瘾。yield的目的是讓相同優(yōu)先級(jí)的線程之間能適當(dāng)?shù)?strong>輪轉(zhuǎn)執(zhí)行
3囊榜、join:把指定的線程加入到當(dāng)前線程,可以將兩個(gè)交替執(zhí)行的線程合并為順序執(zhí)行的線程亥宿。比如線程B中調(diào)用了線程A的JOIN()方法卸勺,直到線程A執(zhí)行完畢后,才會(huì)繼續(xù)執(zhí)行線程B烫扼。

    //主線程等待子線程thread執(zhí)行結(jié)束才會(huì)輸出結(jié)果
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new JoinTest());
        thread.start();
        thread.join(); //加入join()
        System.out.println("主線程結(jié)束");
    }

4曙求、setDaemon:
Java中線程分為兩種類型:用戶線程和守護(hù)線程。通過Thread.setDaemon(false)設(shè)置為用戶線程映企;通過Thread.setDaemon(true)設(shè)置為守護(hù)線程悟狱。如果不設(shè)置次屬性,默認(rèn)為用戶線程卑吭。

  public class DaemonTest extends Thread {
    public void run() {            //永真循環(huán)線程
        for (int i = 0; ; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
            }
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        Thread daemonTest = new DaemonTest();
        daemonTest.setDaemon(true);    //調(diào)試時(shí)可以設(shè)置為false芽淡,那么這個(gè)程序是個(gè)死循環(huán),沒有退出條件豆赏。設(shè)置為true挣菲,即可主線程結(jié)束,test線程也結(jié)束掷邦。
        daemonTest.start();
        System.out.println("isDaemon = " + daemonTest.isDaemon());
        try {
            System.in.read();   // 接受輸入白胀,使程序在此停頓,一旦接收到用戶輸入抚岗,main線程結(jié)束或杠,守護(hù)線程自動(dòng)結(jié)束
        } catch (IOException ex) {
        }
    }
}

如果線程設(shè)置為Thread.setDaemon(true),則主線程結(jié)束該程序不會(huì)結(jié)束宣蔚,必須等待子線程執(zhí)行結(jié)束整個(gè)程序才能結(jié)束向抢;如果線程設(shè)置為Thread.setDaemon(false),則主線程結(jié)束整個(gè)程序就結(jié)束胚委。

5挟鸠、wait、notify亩冬、notifyAll
當(dāng)一個(gè)線程進(jìn)入wait之后艘希,就必須等待其他線程notify/notifyAll,使用notifyAll可以喚醒所有處于wait狀態(tài)的線程,使其重新進(jìn)入鎖的爭(zhēng)奪隊(duì)列中覆享,而notify只能喚醒一個(gè)佳遂。
notify被喚醒的線程是隨機(jī)的,所以通常是沒辦法指定是誰被喚醒撒顿。

線程關(guān)鍵字

  • volatile
    可見性:對(duì)一個(gè)volatile變量的讀丑罪,總是能看到(任意線程)對(duì)這個(gè)volatile變量最后的寫入
    原子性:對(duì)任意單個(gè)volatile變量的讀/寫具有原子性,但是類似于volatile++這種復(fù)合操作不具有原子性
  • synchronized
    當(dāng)它用來修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候核蘸,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼巍糯。然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)客扎,另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
    synchronized 關(guān)鍵字罚斗,它包括兩種用法:synchronized 方法和 synchronized 塊徙鱼。
    synchronized 方法:通過在方法聲明中加入 synchronized關(guān)鍵字來聲明 synchronized 方法
public synchronized void accessVal(int newVal);  

synchronized 塊:通過 synchronized關(guān)鍵字來聲明synchronized 塊

synchronized(syncObject) {  
//允許訪問控制的代碼  
}  

ThreadLocal

ThreadLocal是一個(gè)關(guān)于創(chuàng)建線程局部變量的類。通常情況下针姿,我們創(chuàng)建的變量是可以被任何一個(gè)線程訪問修改的袱吆。而使用ThreadLocal創(chuàng)建的變量只能被當(dāng)前線程訪問,其他線程無法訪問和修改距淫。

在Java中绞绒,棧內(nèi)存歸屬于單個(gè)線程,每個(gè)線程都會(huì)有一個(gè)棧內(nèi)存榕暇,其存儲(chǔ)的變量只能在其所屬線程中可見蓬衡,即棧內(nèi)存可以理解成線程的私有內(nèi)存。而堆內(nèi)存中的對(duì)象對(duì)所有線程可見彤枢。堆內(nèi)存中的對(duì)象可以被所有線程訪問狰晚。

ThreadLocal并不是存放在棧上。ThreadLocal實(shí)例實(shí)際上也是被其創(chuàng)建的類持有(更頂端應(yīng)該是被線程持有)缴啡。而ThreadLocal的值其實(shí)也是被線程實(shí)例持有壁晒。它們都是位于堆上,只是通過一些技巧將可見性修改成線程可見业栅。

//使用ThreadLocal保存Connection變量 
ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>(); 
//保存到線程本地變量中
connThreadLocal.set(conn);  
// 直接返回線程本地變量  
connThreadLocal.get();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秒咐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碘裕,更是在濱河造成了極大的恐慌携取,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘汞,死亡現(xiàn)場(chǎng)離奇詭異歹茶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惊豺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燎孟,“玉大人,你說我怎么就攤上這事尸昧】常” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵烹俗,是天一觀的道長(zhǎng)爆侣。 經(jīng)常有香客問我,道長(zhǎng)幢妄,這世上最難降的妖魔是什么兔仰? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蕉鸳,結(jié)果婚禮上乎赴,老公的妹妹穿的比我還像新娘。我一直安慰自己潮尝,他們只是感情好榕吼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勉失,像睡著了一般羹蚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乱凿,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天顽素,我揣著相機(jī)與錄音,去河邊找鬼告匠。 笑死戈抄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的后专。 我是一名探鬼主播划鸽,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼戚哎!你這毒婦竟也來了裸诽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤型凳,失蹤者是張志新(化名)和其女友劉穎丈冬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甘畅,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂蕊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年往弓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓄氧。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡函似,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喉童,到底是詐尸還是另有隱情撇寞,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布堂氯,位于F島的核電站蔑担,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咽白。R本人自食惡果不足惜啤握,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望局扶。 院中可真熱鬧恨统,春花似錦、人聲如沸三妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畴蒲。三九已至,卻和暖如春对室,著一層夾襖步出監(jiān)牢的瞬間模燥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工掩宜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔫骂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓牺汤,卻偏偏與公主長(zhǎng)得像辽旋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檐迟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • Java SE 基礎(chǔ): 封裝补胚、繼承、多態(tài) 封裝: 概念:就是把對(duì)象的屬性和操作(或服務(wù))結(jié)合為一個(gè)獨(dú)立的整體追迟,并盡...
    Jayden_Cao閱讀 2,109評(píng)論 0 8
  • 下面是我自己收集整理的Java線程相關(guān)的面試題溶其,可以用它來好好準(zhǔn)備面試。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,832評(píng)論 14 507
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的敦间,后來想想還是整...
    coder_pig閱讀 1,649評(píng)論 2 17
  • 本文出自 Eddy Wiki 瓶逃,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,122評(píng)論 0 14
  • 年輕時(shí)主要問題是立足厢绝,立足就需要賺錢契沫,順路再解決下荷爾蒙,看誰順眼就睡睡代芜,有高潮繼續(xù)埠褪,沒高潮散伙,哪有空演那么多大...
    DonkeyDon閱讀 338評(píng)論 0 1