Java創(chuàng)建線程的方式

Java創(chuàng)建線程的四種方式

1.繼承Thread類創(chuàng)建線程

  • 定義Thread類的子類矢赁,并重寫該類的run方法哮幢,run()方法的內(nèi)容就是該線程執(zhí)行的內(nèi)容
  • 創(chuàng)建Thread子類的實(shí)例,即創(chuàng)建了線程對(duì)象扇救。
  • 調(diào)用線程對(duì)象的start()方法來(lái)啟動(dòng)該線程刑枝。
    代碼演示
public class MyThread extends Thread {

    @Override
    public void run() {
        // 執(zhí)行業(yè)務(wù)邏輯
    }

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

2.通過(guò)Runnable接口創(chuàng)建線程類

  • 定義runnable接口的實(shí)現(xiàn)類,并重寫該接口的run()方法迅腔,該run()方法的方法體同樣是該線程的線程執(zhí)行體装畅。
  • 創(chuàng)建 Runnable實(shí)現(xiàn)類的實(shí)例,并依此實(shí)例作為Thread的target來(lái)創(chuàng)建Thread對(duì)象沧烈,該Thread對(duì)象才是真正的線程對(duì)象掠兄。
  • 調(diào)用線程對(duì)象的start()方法來(lái)啟動(dòng)該線程。
    代碼演示
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 執(zhí)行業(yè)務(wù)邏輯
    }
    
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

3.使用Callable接口和FutureTask類實(shí)現(xiàn)創(chuàng)建有返回結(jié)果的線程

FutureTask 的出現(xiàn)是為了彌補(bǔ) Thread 的不足而設(shè)計(jì)的,可以讓程序員跟蹤、獲取任務(wù)的執(zhí)行情況蚂夕、計(jì)算結(jié)果

  • 創(chuàng)建Callable接口的實(shí)現(xiàn)類迅诬,并實(shí)現(xiàn)call()方法,該call()方法將作為線程執(zhí)行體婿牍,并且有返回值百框。
  • 創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例,使用FutureTask類來(lái)包裝Callable對(duì)象牍汹,該FutureTask對(duì)象封裝了該Callable對(duì)- 象的call()方法的返回值。
  • 使用FutureTask對(duì)象作為Thread對(duì)象的target創(chuàng)建并啟動(dòng)新線程柬泽。
  • 調(diào)用FutureTask對(duì)象的get()方法來(lái)獲得子線程執(zhí)行結(jié)束后的返回值慎菲。
    代碼演示
public class MyCallable implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        System.out.println("子線程開(kāi)始計(jì)算");
        Thread.sleep(2000);
        System.out.println("子線程結(jié)束計(jì)算");
        return 100 * 100;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 實(shí)例化Callable對(duì)象
        MyCallable myCallable = new MyCallable();
        // 使用FutureTask包裝
        FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
        // 創(chuàng)建一個(gè)線程執(zhí)行任務(wù)
        Thread thread = new Thread(futureTask);
        thread.start();
        Thread.sleep(1000);
        System.out.println("主線程執(zhí)行");
        // 使用get()方法會(huì)阻塞主線程,直到子線程執(zhí)行完成返回結(jié)果
        int result = futureTask.get();
        System.out.println("子線程計(jì)算結(jié)果: " + result);
    }

}

執(zhí)行結(jié)果

子線程開(kāi)始計(jì)算
主線程執(zhí)行
子線程結(jié)束計(jì)算
子線程計(jì)算結(jié)果: 10000

4.使用線程池創(chuàng)建線程

為什么要使用線程池呢锨并?
當(dāng)不是執(zhí)行一次性任務(wù)的時(shí)候露该,如果不使用線程池,那么就要頻繁的創(chuàng)建和銷毀線程第煮,這是一個(gè)比較消耗資源的操作解幼,使用線程池可以靈活的調(diào)整線程資源的占用,防止消耗過(guò)多的內(nèi)存
在Java中已經(jīng)提供了ExecutorSerice包警、Executors等工具類為我們快速的創(chuàng)建線程池
常用的常見(jiàn)線程的方法有

  • Executors.newFixedThreadPool(int nThreads) --- 創(chuàng)建固定線程數(shù)量的線程池
  • Executors.newSingleThreadPool() --- 創(chuàng)建只包含一個(gè)線程的線程池
  • Executors.newCachedThreadPool() --- 創(chuàng)建一個(gè)可緩存的線程池撵摆。如果線程池的當(dāng)前規(guī)模超過(guò)了處理需求時(shí),那么就會(huì)回收部分空閑的線程(根據(jù)空閑時(shí)間來(lái)回收)害晦,當(dāng)需求增加時(shí)特铝,此線程池又可以智能的添加新線程來(lái)處理任務(wù)。此線程池不會(huì)對(duì)線程池大小做限制壹瘟,線程池大小完全依賴于操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線程大小鲫剿。
  • Executors.newScheduledThreadPool() --- 創(chuàng)建了一個(gè)固定長(zhǎng)度的線程池,而且以延遲或定時(shí)或周期的方式來(lái)執(zhí)行任務(wù)稻轨,類似于Timer灵莲。可應(yīng)用于重發(fā)機(jī)制殴俱。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末政冻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子线欲,更是在濱河造成了極大的恐慌赠幕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件询筏,死亡現(xiàn)場(chǎng)離奇詭異榕堰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門逆屡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圾旨,“玉大人,你說(shuō)我怎么就攤上這事魏蔗】车模” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵莺治,是天一觀的道長(zhǎng)廓鞠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谣旁,這世上最難降的妖魔是什么床佳? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮榄审,結(jié)果婚禮上砌们,老公的妹妹穿的比我還像新娘。我一直安慰自己搁进,他們只是感情好浪感,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著饼问,像睡著了一般影兽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莱革,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天赢笨,我揣著相機(jī)與錄音,去河邊找鬼驮吱。 笑死茧妒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的左冬。 我是一名探鬼主播桐筏,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拇砰!你這毒婦竟也來(lái)了梅忌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤除破,失蹤者是張志新(化名)和其女友劉穎牧氮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瑰枫,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踱葛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年丹莲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尸诽。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甥材,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出性含,到底是詐尸還是另有隱情洲赵,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布商蕴,位于F島的核電站叠萍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绪商。R本人自食惡果不足惜苛谷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望部宿。 院中可真熱鬧,春花似錦瓢湃、人聲如沸理张。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雾叭。三九已至,卻和暖如春落蝙,著一層夾襖步出監(jiān)牢的瞬間织狐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工筏勒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留移迫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓管行,卻偏偏與公主長(zhǎng)得像厨埋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捐顷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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