并發(fā)編程-線程池

概述

  • 線程是進(jìn)程的一個執(zhí)行單元排拷,是CPU任務(wù)調(diào)度的基本單位斤蔓。一個進(jìn)程可以包含多個線程粟按,同一個進(jìn)程下的所有線程共享改進(jìn)程的所有資源

生命周期

EDAC1216-251F-4493-BEA8-2B09CF551227.png
  • 新建狀態(tài):創(chuàng)建實(shí)例

  • 就緒狀態(tài):等待CPU分配時間

  • 運(yùn)行狀態(tài):執(zhí)行中中捆,獲得CPU資源漂彤。

  • 阻塞狀態(tài):釋放cpu資源雾消,在某些條件下回到就緒狀態(tài),調(diào)用sleep方法進(jìn)入阻塞狀態(tài)显歧,釋放cpu資源仪或,不會釋放鎖,調(diào)用wait方法士骤,在釋放資源的同時范删,也會釋放鎖。

  • 死亡狀態(tài):線程執(zhí)行完畢拷肌,或者stop線程到旦。

優(yōu)點(diǎn)

  • 劃分尺度小,執(zhí)行開銷小巨缘,提高并行效率
  • 共享內(nèi)存添忘,提高資源利用率和執(zhí)行效率

缺點(diǎn)

  • 沒有單獨(dú)的地址空間,不能獨(dú)立運(yùn)行若锁,無法對資源進(jìn)行管理搁骑。

創(chuàng)建

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

  • 繼承Thread類
  public class ThreadDemo extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
        System.out.println("創(chuàng)建線程的第一種方式");
    }
}
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.setName("thread-demo");
        //1標(biāo)準(zhǔn)的啟動方式
        threadDemo.start();
      //2、調(diào)用類的方法的啟動方式
        threadDemo.run();

start()和run()的區(qū)別:
start()方法會創(chuàng)建一個新的線程又固,執(zhí)行run方法仲器。
run()方法,類的方法調(diào)用是在主線程上執(zhí)行仰冠。
可通過在Thread.currentThread().getName()查看執(zhí)行線程名

  • 繼承runable接口
public class RunableDemo implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
        System.out.println("創(chuàng)建線程的第二種方法");
    }
}
Thread thread = new Thread(new RunableDemo());
        thread.start();

推薦使用這種方式乏冀,有利于在多繼承的情況下的代碼擴(kuò)展

  • 有返回值的創(chuàng)建線程的callable方式
public class CallableDemo implements Callable {
    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName());
        System.out.println("創(chuàng)建線程的第二種方法");
        return 1;
    }
}
        CallableDemo callableDemo = new CallableDemo();
        FutureTask futureTask = new FutureTask(callableDemo);
        Thread callThread = new Thread(futureTask,"返回值");
        callThread.start();
        futureTask.get();

以繼承callable接口創(chuàng)建線程,可以有返回值洋只,通過cas原理把數(shù)據(jù)set到futureTask對象中辆沦,調(diào)用get方式會使程序進(jìn)入阻塞狀態(tài),直到線程執(zhí)行完畢拿到返回值识虚。

  • 線程池

E120FD3A-8122-44C4-B5E9-B9B8447A8298.png
  • 頂層接口Executor肢扯,內(nèi)部包含一個execute方法,入?yún)⑹莻€Runable對象担锤。
  • ThreadPoolExecutor鹃彻,線程池定義類
    * corePoolSize 核心線程數(shù)
    * maximumPoolSize 最大線程數(shù)
    * keepAliveTime 空閑時間
    * unit 單位
    * workQueue 工作隊(duì)列,用于管理任務(wù)
    * threadFactory 線程工廠類
    * defaultHandler 默認(rèn)處理方法,工作隊(duì)列無空閑的情況下的處理辦法妻献。
  • Executors 創(chuàng)建線程池的工具類蛛株,tips:工具類一般都是以s結(jié)尾,例:Collections育拨、Arrays
線程池種類
  • 單一線程執(zhí)行任務(wù)谨履,F(xiàn)IFO機(jī)制,保證任務(wù)的有序性,線程池核心線程和最大線程數(shù)均為1熬丧,永不過期笋粟,以一個鏈表隊(duì)列管理任務(wù)有序執(zhí)行。源碼結(jié)構(gòu):
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
  • 固定大小的線程池析蝴,當(dāng)有新的任務(wù)進(jìn)來害捕,就會創(chuàng)建一個新的線程去執(zhí)行,任務(wù)執(zhí)行完畢闷畸,線程并不會被回收尝盼,而是變成空閑線程,等待執(zhí)行下次任務(wù)佑菩,會占用一部分資源盾沫,但是節(jié)約了線程重復(fù)創(chuàng)建和銷毀的開銷。
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
  • 不固定大小的線程池殿漠,創(chuàng)建線程最大數(shù)為Integer.MAX_VALUE,而且可以回收空閑線程赴精。
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
  • 定時任務(wù)線程,定時任務(wù)绞幌,支持周期性工作蕾哟。
public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
四種方式可以根據(jù)實(shí)際情況選擇,可以不使用工具類的方式創(chuàng)建線程池莲蜘,直接實(shí)例話線程池類谭确,按照需求自定義里面的參數(shù)會更加合適。

下篇:線程池-BlockQueue(線程容器)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菇夸,一起剝皮案震驚了整個濱河市琼富,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庄新,老刑警劉巖鞠眉,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異择诈,居然都是意外死亡械蹋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門羞芍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哗戈,“玉大人,你說我怎么就攤上這事荷科∥ㄒВ” “怎么了纱注?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胆胰。 經(jīng)常有香客問我狞贱,道長,這世上最難降的妖魔是什么蜀涨? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任瞎嬉,我火速辦了婚禮,結(jié)果婚禮上厚柳,老公的妹妹穿的比我還像新娘氧枣。我一直安慰自己,他們只是感情好别垮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布便监。 她就那樣靜靜地躺著,像睡著了一般宰闰。 火紅的嫁衣襯著肌膚如雪茬贵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天移袍,我揣著相機(jī)與錄音解藻,去河邊找鬼。 笑死葡盗,一個胖子當(dāng)著我的面吹牛螟左,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觅够,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼胶背,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喘先?” 一聲冷哼從身側(cè)響起钳吟,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窘拯,沒想到半個月后红且,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涤姊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年暇番,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思喊。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡壁酬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舆乔,我是刑警寧澤岳服,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蜕煌,受9級特大地震影響派阱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斜纪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望文兑。 院中可真熱鬧盒刚,春花似錦、人聲如沸绿贞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽籍铁。三九已至涡上,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拒名,已是汗流浹背吩愧。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留增显,地道東北人雁佳。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像同云,于是被迫代替她去往敵國和親糖权。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360