Java 線程

線程

<code>java<code> 創(chuàng)建線程最簡(jiǎn)單的方式就是繼承<code>Thread</code>類或者實(shí)現(xiàn) <code>Runnable</code>接口實(shí)現(xiàn) <code>run()</code> 方法陈症,然后調(diào)用 <code>start()</code> 方法來讓線程執(zhí)行漂问。

public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread());
            }
        }).start();
    }

輸出:

Thread[Thread-0,5,main] 這個(gè)是輸出的是線程名赖瞒,線程優(yōu)先級(jí)以及線程組的名字,具體可以看<code>Thread</code> 的<code>toString()</code> 方法

實(shí)際上 實(shí)現(xiàn) Runnable 接口的類可以看做是一個(gè)任務(wù)(<code>task</code>)真正創(chuàng)建線程的是 <code>Thread</code>類

線程池

JDK 中提供了 Executor 框架來創(chuàng)建線程池蚤假。
其中 <code>Executors</code>作為工廠類 提供了幾個(gè)創(chuàng)建線程的工廠方法

public class ThreadTest {

    public static void main(String[] args) {
        TestTask tt = new TestTask();
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i <10;i++){
            executorService.submit(tt);
        }
    }

}

class TestTask implements Runnable {

    @Override
    public void run() {
        System.out.println(System.currentTimeMillis() + " Thread ID:" + Thread.currentThread().getId());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

輸出:

1495507701904 Thread ID:10
1495507701905 Thread ID:11
1495507701904 Thread ID:9
1495507701905 Thread ID:12
1495507701905 Thread ID:13
1495507702909 Thread ID:9
1495507702909 Thread ID:12
1495507702909 Thread ID:11
1495507702909 Thread ID:13
1495507702909 Thread ID:10

<code>newFixedThreadPool(int nThreads)</code> 接收一個(gè) <code>int</code> 參數(shù)栏饮,返回一個(gè)固定大小的線程池,上面代碼的輸出可以看出十個(gè)任務(wù)提交到線程池中,前5個(gè)和后面的5個(gè)執(zhí)行相差了1秒磷仰。
如果換成<code>newCachedThreadPool()</code>來創(chuàng)建線程池則會(huì)得到如下輸出:

1495508104585 Thread ID:9
1495508104586 Thread ID:10
1495508104586 Thread ID:11
1495508104586 Thread ID:12
1495508104586 Thread ID:13
1495508104586 Thread ID:14
1495508104587 Thread ID:15
1495508104587 Thread ID:16
1495508104587 Thread ID:17
1495508104587 Thread ID:18

線程池的核心

<code>Executors</code> 提供這些工廠方法都是通過<code>ThreadPoolExecutor</code>來實(shí)現(xiàn)
<code>ThreadPoolExecutor</code>中提供了四個(gè)構(gòu)造方法袍嬉,而其他三個(gè)都是通過下圖這個(gè)構(gòu)造方法來實(shí)現(xiàn)。


jdk 源碼上提供的注釋說明

/**
    * Creates a new {@code ThreadPoolExecutor} with the given initial
    * parameters.
    *
    * @param corePoolSize the number of threads to keep in the pool, even
    *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
    * @param maximumPoolSize the maximum number of threads to allow in the
    *        pool
    * @param keepAliveTime when the number of threads is greater than
    *        the core, this is the maximum time that excess idle threads
    *        will wait for new tasks before terminating.
    * @param unit the time unit for the {@code keepAliveTime} argument
    * @param workQueue the queue to use for holding tasks before they are
    *        executed.  This queue will hold only the {@code Runnable}
    *        tasks submitted by the {@code execute} method.
    * @param threadFactory the factory to use when the executor
    *        creates a new thread
    * @param handler the handler to use when execution is blocked
    *        because the thread bounds and queue capacities are reached
    * @throws IllegalArgumentException if one of the following holds:<br>
    *         {@code corePoolSize < 0}<br>
    *         {@code keepAliveTime < 0}<br>
    *         {@code maximumPoolSize <= 0}<br>
    *         {@code maximumPoolSize < corePoolSize}
    * @throws NullPointerException if {@code workQueue}
    *         or {@code threadFactory} or {@code handler} is null
    */

<code> corePoolSize </code> 指定線程池中保持的線程數(shù)量灶平,即使他們是空閑的伺通,除非設(shè)置了<code>allowCoreThreadTimeOut</code>

<code> maximumPoolSize </code> 指定線程池允許創(chuàng)建的最大線程數(shù)量

<code> keepAliveTime </code> 當(dāng)線程池中的線程數(shù)量大于<code> corePoolSize </code>設(shè)置的數(shù)量時(shí),大于<code> corePoolSize </code>數(shù)量的那部分線程等待新任務(wù)的最大等待時(shí)間逢享,當(dāng)超過這個(gè)時(shí)間多出來的線程將會(huì)被銷毀罐监。

<code> unit </code> <code> keepAliveTime </code>的時(shí)間單位

<code> workQueue </code> 用于保存通過 <code>execute</code> 方法提交并且未來得及執(zhí)行的任務(wù)。

<code> threadFactory </code> 用來創(chuàng)建線程的線程工廠
<code> handler </code> 當(dāng)線程池中線程數(shù)量到達(dá)極限并且 workQueue達(dá)到最大容量時(shí) 處理任務(wù)的拒絕策略

workQueue傳入的是一個(gè) <code>BlockingQueue</code>類型的參數(shù)瞒爬,用于保存 Runnable 對(duì)象

可使用的<code>BlockingQueue</code>有:
<code>SynchronousQueue</code> 直接提交的隊(duì)列
<code>ArrayBlockingQueue</code> 有界隊(duì)列
<code>LinkedBlockingQueue</code> 無界隊(duì)列
<code>PriorityBlockingQueue</code> 優(yōu)先級(jí)隊(duì)列

<code>handler</code>
有四種拒絕策略
<code>AbortPolicy</code> 直接拋出異常
<code>DiscardPolicy</code> 默默拋棄
<code>DiscardOldestPolicy</code> 丟棄最老的任務(wù)弓柱,也就是即將執(zhí)行的任務(wù)
<code>CallerRunsPolicy</code> 在調(diào)用線程中執(zhí)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沟堡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矢空,更是在濱河造成了極大的恐慌航罗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁药,死亡現(xiàn)場(chǎng)離奇詭異粥血,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酿箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門立莉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人七问,你說我怎么就攤上這事∶2埃” “怎么了械巡?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饶氏。 經(jīng)常有香客問我讥耗,道長(zhǎng),這世上最難降的妖魔是什么疹启? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任古程,我火速辦了婚禮,結(jié)果婚禮上喊崖,老公的妹妹穿的比我還像新娘挣磨。我一直安慰自己,他們只是感情好荤懂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布茁裙。 她就那樣靜靜地躺著,像睡著了一般节仿。 火紅的嫁衣襯著肌膚如雪晤锥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天廊宪,我揣著相機(jī)與錄音矾瘾,去河邊找鬼。 笑死箭启,一個(gè)胖子當(dāng)著我的面吹牛壕翩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播册烈,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼戈泼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼婿禽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起大猛,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤扭倾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挽绩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膛壹,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年唉堪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了模聋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唠亚,死狀恐怖链方,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灶搜,我是刑警寧澤祟蚀,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站割卖,受9級(jí)特大地震影響前酿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹏溯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一罢维、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丙挽,春花似錦肺孵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞬浓,卻和暖如春初婆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猿棉。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工磅叛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萨赁。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓弊琴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親杖爽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敲董,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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