02.Java基礎(chǔ)(線程池)

執(zhí)行異步任務(wù)的時(shí)候,如果只是new Thread,存在一下弊端

a. 每次new Thread新建對(duì)象性能差。
b. 線程缺乏統(tǒng)一管理,可能無(wú)限制新建線程,相互之間競(jìng)爭(zhēng),及可能占用過(guò)多系統(tǒng)資源導(dǎo)致死機(jī)或oom。
c. 缺乏更多功能,如定時(shí)執(zhí)行、定期執(zhí)行、線程中斷。

Java本身提供了四種線程池

newCachedThreadPool

創(chuàng)建一個(gè)可緩存的線程池。如果線程池的大小超過(guò)了處理任務(wù)所需要的線程,
那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智
能的添加新線程來(lái)處理任務(wù)。此線程池不會(huì)對(duì)線程池大小做限制,線程池大小完全依賴于
操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線程大小。

newCachedThreadPool是存在內(nèi)存溢出安全隱患的,因?yàn)槲覀兗僭O(shè)新建的線程都在工
作,newCachedThreadPool 只會(huì)重用空閑并且可用的線程,所以當(dāng)所需線程數(shù)量足夠大
時(shí),會(huì)不停地創(chuàng)建新線程,在 64-bit JDK 1.7 中 -Xss 默認(rèn)是 1024k,也就是 1M(一個(gè)線
程占用的空間大小),那就是需要 10000*1M = 10G 的堆外內(nèi)存空間來(lái)給線程使用,就 會(huì)
發(fā)生OOM 

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
      final int index = i;
try {
      Thread.sleep(index * 1000);
} catch (InterruptedException e) {
      e.printStackTrace();
}
 
cachedThreadPool.execute(new Runnable() {
      @Override
      public void run() {
            System.out.println(index);
      }
});

newFixedThreadPool 
創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
      final int index = i;
      fixedThreadPool.execute(new Runnable() {
 
            @Override
            public void run() {
            try {
                  System.out.println(index);
                  Thread.sleep(2000);
            } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }
});
newScheduledThreadPool 
創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
      @Override
      public void run() {
            System.out.println("delay 3 seconds");
      }
}, 3, TimeUnit.SECONDS);

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
      @Override
      public void run() {
            System.out.println("delay 1 seconds, and excute every 3 seconds");
      }
}, 1, 3, TimeUnit.SECONDS);
newSingleThreadExecutor 
創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
      final int index = i;
      singleThreadExecutor.execute(new Runnable() {
            @Override
            public void run() {
            try {
                  System.out.println(index);
                  Thread.sleep(2000);
            } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }
});

相對(duì)于直接new Thread,線程池具有一下優(yōu)點(diǎn)

a. 重用存在的線程,減少對(duì)象創(chuàng)建、消亡的開(kāi)銷(xiāo),性能佳。
b. 可有效控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過(guò)多資源競(jìng)爭(zhēng),避免堵塞。
c. 提供定時(shí)執(zhí)行、定期執(zhí)行、單線程、并發(fā)數(shù)控制等功能
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前段時(shí)間遇到這樣一個(gè)問(wèn)題,有人問(wèn)微信朋友圈的上傳圖片的功能怎么做才能讓用戶的等待時(shí)間較短,比如說(shuō)一下上傳9張圖片,...
    加油碼農(nóng)閱讀 1,278評(píng)論 0 2
  • 一、多線程 說(shuō)明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是,通過(guò) New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,857評(píng)論 0 44
  • 我們的故事不浪漫不美好,卻狗血的讓我無(wú)法忘懷。我搞不懂這么久了我到底是忘不了什么放不下什么?
    胖girl閱讀 261評(píng)論 0 0
  • 文(杉之左) 題記:珍惜當(dāng)下,珍惜時(shí)間 遺忘舊日的臺(tái)階 柚子熟了蒂落在青苔鋪成的地毯上 爛在黑暗的日子 蘊(yùn)涵的季節(jié)...
    伶隱士閱讀 324評(píng)論 12 13
  • 網(wǎng)絡(luò)營(yíng)銷(xiāo)軟件的最終用戶群體是從事網(wǎng)絡(luò)營(yíng)銷(xiāo)的全部企業(yè)和個(gè)人,只有用戶群多的網(wǎng)絡(luò)營(yíng)銷(xiāo)軟件才是成功的。因此最好的網(wǎng)絡(luò)...
    skycc123閱讀 194評(píng)論 0 0

友情鏈接更多精彩內(nèi)容