官术网_书友最值得收藏!

3.3 5種常用的線程池

Java定義了Executor接口并在該接口中定義了execute()用于執(zhí)行一個線程任務(wù),然后通過ExecutorService實現(xiàn)Executor接口并執(zhí)行具體的線程操作。ExecutorService接口有多個實現(xiàn)類可用于創(chuàng)建不同的線程池,如表3-2所示是5種常用的線程池。

表3-2

3.3.1 newCachedThreadPool

newCachedThreadPool用于創(chuàng)建一個緩存線程池。之所以叫緩存線程池,是因為它在創(chuàng)建新線程時如果有可重用的線程,則重用它們,否則重新創(chuàng)建一個新的線程并將其添加到線程池中。對于執(zhí)行時間很短的任務(wù)而言,newCachedThreadPool線程池能很大程度地重用線程進而提高系統(tǒng)的性能。

在線程池的keepAliveTime時間超過默認(rèn)的60秒后,該線程會被終止并從緩存中移除,因此在沒有線程任務(wù)運行時,newCachedThreadPool將不會占用系統(tǒng)的線程資源。

在創(chuàng)建線程時需要執(zhí)行申請CPU和內(nèi)存、記錄線程狀態(tài)、控制阻塞等多項工作,復(fù)雜且耗時。因此,在有執(zhí)行時間很短的大量任務(wù)需要執(zhí)行的情況下,newCachedThreadPool能夠很好地復(fù)用運行中的線程(任務(wù)已經(jīng)完成但未關(guān)閉的線程)資源來提高系統(tǒng)的運行效率。具體的創(chuàng)建方式如下:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

3.3.2 newFixedThreadPool

newFixedThreadPool用于創(chuàng)建一個固定線程數(shù)量的線程池,并將線程資源存放在隊列中循環(huán)使用。在newFixedThreadPool線程池中,若處于活動狀態(tài)的線程數(shù)量大于等于核心線程池的數(shù)量,則新提交的任務(wù)將在阻塞隊列中排隊,直到有可用的線程資源,具體的創(chuàng)建方式如下:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

3.3.3 newScheduledThreadPool

newScheduledThreadPool創(chuàng)建了一個可定時調(diào)度的線程池,可設(shè)置在給定的延遲時間后執(zhí)行或者定期執(zhí)行某個線程任務(wù):

ScheduledExecutorService  scheduledThreadPool=
                    Executors.newScheduledThreadPool(3);
//1:創(chuàng)建一個延遲3秒執(zhí)行的線程
 scheduledThreadPool.schedule(newRunnable(){
        @Override
        public  void  run()  {
              System.out.println("delay  3  seconds  execu.");
 }},  3,  TimeUnit.SECONDS);
 //2:創(chuàng)建一個延遲1秒執(zhí)行且每3秒執(zhí)行一次的線程
 scheduledThreadPool.scheduleAtFixedRate(newRunnable(){
      @Override
      public  void  run()  {
      System.out.println("delay  1  seconds, repeat  execute  every  3  seconds");
  }},1,3, TimeUnit.SECONDS);

3.3.4 newSingleThreadExecutor

newSingleThreadExecutor線程池會保證永遠有且只有一個可用的線程,在該線程停止或發(fā)生異常時,newSingleThreadExecutor線程池會啟動一個新的線程來代替該線程繼續(xù)執(zhí)行任務(wù):

ExecutorService singleThread = Executors.newSingleThreadExecutor();

3.3.5 newWorkStealingPool

newWorkStealingPool創(chuàng)建持有足夠線程的線程池來達到快速運算的目的,在內(nèi)部通過使用多個隊列來減少各個線程調(diào)度產(chǎn)生的競爭。這里所說的有足夠的線程指JDK根據(jù)當(dāng)前線程的運行需求向操作系統(tǒng)申請足夠的線程,以保障線程的快速執(zhí)行,并很大程度地使用系統(tǒng)資源,提高并發(fā)計算的效率,省去用戶根據(jù)CPU資源估算并行度的過程。當(dāng)然,如果開發(fā)者想自己定義線程的并發(fā)數(shù),則也可以將其作為參數(shù)傳入。

主站蜘蛛池模板: 郑州市| 永清县| 深圳市| 平山县| 琼中| 澜沧| 兴义市| 扬中市| 上杭县| 陵水| 浦北县| 沽源县| 来凤县| 中西区| 隆回县| 高平市| 郎溪县| 美姑县| 昌江| 昌平区| 沛县| 开封县| 宝丰县| 天等县| 开远市| 甘肃省| 博湖县| 赣榆县| 衡水市| 日土县| 泰宁县| 通化市| 讷河市| 辽源市| 辉南县| 汕尾市| 曲周县| 丹巴县| 安新县| 华阴市| 方城县|