JavaSE多線程

Java并發(fā)編程

當(dāng)一個程序啟動后屹逛,操作系統(tǒng)就會為這個程序創(chuàng)建一個進程并分配內(nèi)存空間。如果這個程序是一個Java程序汛骂,那么它的內(nèi)存空間會分為堆區(qū)罕模、棧區(qū)、元數(shù)據(jù)區(qū)帘瞭、本地方法棧淑掌、程序計數(shù)器等。

當(dāng)進程創(chuàng)建完后蝶念,棧中的主線程也就是main方法就會開始執(zhí)行抛腕。在并發(fā)編程的需求下,需要創(chuàng)建子線程媒殉,首先在堆中創(chuàng)建一個線程對象担敌,然后啟動它。

  • 進程适袜,是對運行時程序的封裝柄错,是操作系統(tǒng)進行資源調(diào)度和分配的基本單位舷夺,實現(xiàn)了操作系統(tǒng)的并發(fā)苦酱。
  • 線程售貌,是進程的子任務(wù),是CPU調(diào)度和分派的基本單位疫萤,實現(xiàn)了進程內(nèi)部的并發(fā)颂跨。

一、線程的創(chuàng)建

創(chuàng)建Java線程有三種方式

1. 繼承Thread類

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "第" + i + "次執(zhí)行");
        }
    }
}
//創(chuàng)建MyThread對象
MyThread t1=new  MyThread();
MyThread t2=new  MyThread();
//設(shè)置線程的名字
t1.setName("T1線程");
t2.setName("T2線程");
//啟動線程
t1.start();
t2.start();

2. 實現(xiàn)Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {//sleep會發(fā)生異常要顯示處理
                Thread.sleep(20);//暫停20毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName() + "第" + i + "次執(zhí)行");
        }
    }
}
//創(chuàng)建MyRunnable類
MyRunnable mr = new MyRunnable();
//創(chuàng)建Thread類的有參構(gòu)造,并設(shè)置線程名
Thread t1 = new Thread(mr, "T1線程");
Thread t2 = new Thread(mr, "T2線程");
//啟動線程
t1.start();
t2.start();

3. 使用FutureTask類

FutureTask是RunnableFuture的實現(xiàn)類扯饶,RunnableFuture又是Runnable和Future的子接口

FutureTask類的構(gòu)造方法可以傳入Callable接口實現(xiàn)類的實例恒削,也可以傳入Runnable接口的實例與線程執(zhí)行后的返回值

這種創(chuàng)建線程的方法可以在主線程中獲取子線程的返回值以及拋出的異常

public class CallerTask implements Callable<String> {
    public String call() throws Exception {
        return "task done";
    }
}
//創(chuàng)建異步任務(wù)
FutureTask<String> task = new FutureTask<String>(new CallerTask());
//啟動線程
new Thread(task).start();
try {
    //等待執(zhí)行完成,并獲取返回結(jié)果
    String result = task.get();
    //String result = task.get(5,TimeUnit.MINUTES);
    System.out.println(result);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    //通過調(diào)用getCause獲取線程拋出的異常
    Throwable cause = e.getCause();
    e.printStackTrace();
} catch (TimeoutException e) {
    //如果調(diào)用帶有參數(shù)的get方法尾序,當(dāng)線程超時后會拋出此異常
    e.printStackTrace();
}
  • run()方法和start()方法有什么區(qū)別钓丰?
    • run():封裝線程執(zhí)行的代碼,直接調(diào)用相當(dāng)于調(diào)用普通方法每币。
    • start():啟動線程携丁,然后由JVM 調(diào)用此線程的 run() 方法。

二兰怠、線程的狀態(tài)

在java.lang.Thread類中的內(nèi)部枚舉梦鉴,定義了Java線程的六種狀態(tài)。

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

1. NEW(新建狀態(tài))

處于NEW狀態(tài)的線程此時尚未啟動揭保。這里的尚未啟動指的是還沒調(diào)用Thread實例的start()方法肥橙。

private void testStateNew() {
    Thread thread = new Thread(() -> {});
    System.out.println(thread.getState()); // 輸出 NEW 
}

2. RUNNABLE(可運行狀態(tài))

Java線程的RUNNABLE狀態(tài)包括了傳統(tǒng)操作系統(tǒng)線程的readyrunning兩個狀態(tài)的。

處于RUNNABLE狀態(tài)的線程在Java虛擬機中運行秸侣,也有可能在等待CPU分配資源存筏。

Thread源碼里對RUNNABLE狀態(tài)的定義:

/**
 * Thread state for a runnable thread.  A thread in the runnable
 * state is executing in the Java virtual machine but it may
 * be waiting for other resources from the operating system
 * such as processor.
 */
 //可運行的線程狀態(tài)。處于可運行狀態(tài)的線程正在 Java 虛擬機中執(zhí)行味榛,也可能正在等待來自操作系統(tǒng)(如處理器)的其他資源方篮。

3. BLOCKED(阻塞狀態(tài))

處于BLOCKED狀態(tài)的線程正等待鎖的釋放以進入同步區(qū)。

4. WAITING(等待狀態(tài))

處于等待狀態(tài)的線程變成RUNNABLE狀態(tài)需要其他線程喚醒励负。

調(diào)用如下3個方法會使線程進入等待狀態(tài):

  • Object.wait():使當(dāng)前線程處于等待狀態(tài)直到另一個線程喚醒它藕溅;
  • Thread.join():等待線程執(zhí)行完畢,底層調(diào)用的是Object實例的wait方法继榆;
  • LockSupport.park():除非獲得調(diào)用許可巾表,否則禁用當(dāng)前線程進行線程調(diào)度。

5. TIMED_WAITING(超時等待狀態(tài))

線程等待一個具體的時間略吨,時間到后會被自動喚醒集币。

調(diào)用如下方法會使線程進入超時等待狀態(tài):

  • Thread.sleep(long millis):使當(dāng)前線程睡眠指定時間;
  • Object.wait(long timeout):線程休眠指定時間翠忠,等待期間可以通過notify()/notifyAll()喚醒鞠苟;
  • Thread.join(long millis):等待當(dāng)前線程最多執(zhí)行millis毫秒,如果millis為0,則會一直執(zhí)行当娱;
  • LockSupport.parkNanos(long nanos): 除非獲得調(diào)用許可吃既,否則禁用當(dāng)前線程進行線程調(diào)度指定時間;
  • LockSupport.parkUntil(long deadline):同上跨细,也是禁止線程進行調(diào)度指定時間鹦倚;

6. TERMINATED(終止?fàn)顟B(tài))

此時線程執(zhí)行完畢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冀惭,一起剝皮案震驚了整個濱河市震叙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌散休,老刑警劉巖媒楼,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戚丸,居然都是意外死亡匣砖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門昏滴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猴鲫,“玉大人,你說我怎么就攤上這事谣殊》鞴玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵姻几,是天一觀的道長宜狐。 經(jīng)常有香客問我,道長蛇捌,這世上最難降的妖魔是什么抚恒? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮络拌,結(jié)果婚禮上俭驮,老公的妹妹穿的比我還像新娘。我一直安慰自己春贸,他們只是感情好混萝,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萍恕,像睡著了一般逸嘀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允粤,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天崭倘,我揣著相機與錄音翼岁,去河邊找鬼。 笑死司光,一個胖子當(dāng)著我的面吹牛琅坡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播飘庄,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼脑蠕,長吁一口氣:“原來是場噩夢啊……” “哼购撼!你這毒婦竟也來了跪削?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤迂求,失蹤者是張志新(化名)和其女友劉穎碾盐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揩局,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡毫玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凌盯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片付枫。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驰怎,靈堂內(nèi)的尸體忽然破棺而出阐滩,到底是詐尸還是另有隱情,我是刑警寧澤县忌,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布掂榔,位于F島的核電站,受9級特大地震影響症杏,放射性物質(zhì)發(fā)生泄漏装获。R本人自食惡果不足惜厉颤,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肋杖。 院中可真熱鬧浊竟,春花似錦振定、人聲如沸后频。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迟几。三九已至类腮,卻和暖如春因宇,著一層夾襖步出監(jiān)牢的瞬間察滑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工吃靠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巢块,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓族奢,卻偏偏與公主長得像姥闭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子越走,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348