14.線程及線程池

首先說一下在開發(fā)中為什么會有線程和線程池川慌。

日常開發(fā)中,如果一個操作需要好幾個步完成侣夷,其中有一兩個步非同步或事務(wù)操作横朋,比如記錄日志,那么為了提高響應(yīng)時(shí)間百拓,可以把這一兩步單獨(dú)開一個線程琴锭,由新開的線程來完成。
為什么會有線程池呢衙传?如果當(dāng)前并發(fā)巨大决帖,同一時(shí)刻會啟動多個線程來完成,那么隨著線程的增多蓖捶,服務(wù)器的內(nèi)存最終會耗盡古瓤,因此需要有線程池來管理這些線程,設(shè)置線程池的容量腺阳,新開了線程落君,都放到線程池等待,有空余資源就處理這些線程亭引。這樣就避免新開無數(shù)線程導(dǎo)致服務(wù)器資源耗盡的情況了绎速。

新建一個線程

新建一個類FirstThread,該類實(shí)現(xiàn)Runnable接口焙蚓,并重寫Run方法纹冤,則該類就可以做為一個線程實(shí)現(xiàn)類來使用洒宝。
代碼如下:

public class FirstThread implements Runnable {
    private String username;//傳參數(shù)

    public FirstThread(String username) {
        this.username = username;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(username + i);
        }
    }
}

線程啟動

首先new 當(dāng)前的FirstThread,再new 一個Thread萌京,執(zhí)行start方法即可雁歌,比如:

public static void main(String[] args) {
        FirstThread ft1 = new FirstThread("張三");
        FirstThread ft2 = new FirstThread("李四");
        Thread t1 = new Thread(ft1);
        Thread t2 = new Thread(ft2);
        t1.start();
        t2.start();
    }

線程池

線程池原理如下:
1、Executors.newFixedThreadPool(10)初始化一個包含10個線程的線程池executor知残;
2靠瞎、通過executor.execute方法提交20個任務(wù),每個任務(wù)打印當(dāng)前的線程名求妹;
3乏盐、負(fù)責(zé)執(zhí)行任務(wù)的線程的生命周期都由Executor框架進(jìn)行管理;
4制恍、線程池里最大有10個線程父能,如果超過10個,其余的等待净神,執(zhí)行完后再進(jìn)入線程池進(jìn)行任務(wù)執(zhí)行何吝。如果小于10個,則直接全部執(zhí)行鹃唯。

代碼如下:

/**
 * Created by 孔垂云 on 2017/4/21.
 */
public class ExecutorTest {
    private static Executor executor = Executors.newFixedThreadPool(10);//新建一個10個線程的線程池

    /**
     * 內(nèi)部類實(shí)現(xiàn)一個線程
     */
    static class Task implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());//打印當(dāng)前線程的名稱
           try {
                TimeUnit.SECONDS.sleep(new Random().nextInt(10));//暫停幾秒鐘
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            executor.execute(new Task());
        }
    }
}

Future和Callable實(shí)現(xiàn)

/**
 * Created by 孔垂云 on 2017/4/21.
 */
public class FutureTest {

    private static ExecutorService executor = Executors.newFixedThreadPool(10);//定義10個線程的線程池

    static class Task implements Callable<String> {
        @Override
        public String call() throws Exception {
            TimeUnit.SECONDS.sleep(1);
            return "Hello Future";
        }
    }

    public static void main(String[] args) throws Exception {
        Future<String> future = executor.submit(new Task());
        System.out.println("開始執(zhí)行線程:");
        String ret = future.get();//獲取該線程的返回值
        System.out.println("執(zhí)行結(jié)果:" + ret);
        System.out.println("執(zhí)行完畢");
        executor.shutdown();
    }
}

在實(shí)際業(yè)務(wù)場景中岔霸,F(xiàn)uture和Callable基本是成對出現(xiàn)的,Callable負(fù)責(zé)產(chǎn)生結(jié)果俯渤,F(xiàn)uture負(fù)責(zé)獲取結(jié)果呆细。
1、Callable接口類似于Runnable八匠,只是Runnable沒有返回值絮爷。
2、Callable任務(wù)除了返回正常結(jié)果之外梨树,如果發(fā)生異常坑夯,該異常也會被返回,即Future可以拿到異步執(zhí)行任務(wù)各種結(jié)果抡四;
3柜蜈、Future.get方法會導(dǎo)致主線程阻塞,直到Callable任務(wù)執(zhí)行完成指巡;
4淑履、線程都執(zhí)行完畢后,執(zhí)行executor.shutdown();藻雪,關(guān)閉主進(jìn)程秘噪。

源碼下載

本例子詳細(xì)源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勉耀,隨后出現(xiàn)的幾起案子指煎,更是在濱河造成了極大的恐慌蹋偏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件至壤,死亡現(xiàn)場離奇詭異威始,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)像街,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門黎棠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宅广,你說我怎么就攤上這事葫掉⌒┚伲” “怎么了跟狱?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長户魏。 經(jīng)常有香客問我驶臊,道長,這世上最難降的妖魔是什么叼丑? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任关翎,我火速辦了婚禮,結(jié)果婚禮上鸠信,老公的妹妹穿的比我還像新娘纵寝。我一直安慰自己,他們只是感情好星立,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布爽茴。 她就那樣靜靜地躺著,像睡著了一般绰垂。 火紅的嫁衣襯著肌膚如雪室奏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天劲装,我揣著相機(jī)與錄音胧沫,去河邊找鬼。 笑死占业,一個胖子當(dāng)著我的面吹牛绒怨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谦疾,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼窖逗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了餐蔬?” 一聲冷哼從身側(cè)響起碎紊,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤佑附,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仗考,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體音同,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年秃嗜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了权均。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡锅锨,死狀恐怖叽赊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情必搞,我是刑警寧澤必指,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站恕洲,受9級特大地震影響塔橡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霜第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一葛家、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泌类,春花似錦癞谒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喇澡,卻和暖如春迅栅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晴玖。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工浦旱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颁虐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像谒臼,于是被迫代替她去往敵國和親舒萎。 傳聞我的和親對象是個殘疾皇子笼痹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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

  • 為什么要用線程池 關(guān)于為什么要使用多線程坞靶,請參考【多線程與并發(fā)】:線程的創(chuàng)建、狀態(tài)、方法中的最后一點(diǎn)椭迎。 那為什么要...
    maxwellyue閱讀 546評論 0 1
  • 一.線程與進(jìn)程相關(guān) 1.進(jìn)程 ??定義:進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動锐帜,進(jìn)程是操作系統(tǒng)分...
    Geeks_Liu閱讀 1,710評論 2 4
  • 先看幾個概念:線程:進(jìn)程中負(fù)責(zé)程序執(zhí)行的執(zhí)行單元缴阎。一個進(jìn)程中至少有一個線程。多線程:解決多任務(wù)同時(shí)執(zhí)行的需求简软,合理...
    yeying12321閱讀 540評論 0 0
  • 前言:線程是稀缺資源蛮拔,如果被無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源痹升,還會降低系統(tǒng)的穩(wěn)定性建炫,合理的使用線程池對線程進(jìn)行統(tǒng)一...
    SDY_0656閱讀 710評論 0 1
  • 兩天以前到附近最豪華的電影院看了煎餅俠,當(dāng)天上午還一同看了《大圣歸來》疼蛾,“大圣”期待太高肛跌,現(xiàn)實(shí)殘酷,煎餅俠卻驚...
    神石道長閱讀 529評論 6 2