最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java四種線程池的使用詳解

 更新時間:2017年08月31日 09:03:12   作者:cuisuqiang  
本篇文章主要介紹了Java四種線程池的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Java通過Executors提供四種線程池,分別為:

newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。

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

newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行。

newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

(1) newCachedThreadPool

創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 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() { 
  public void run() { 
   System.out.println(index); 
  } 
  }); 
 } 
 } 
} 

線程池為無限大,當執(zhí)行第二個任務時第一個任務已經(jīng)完成,會復用執(zhí)行第一個任務的線程,而不用每次新建線程。

(2) newFixedThreadPool

創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。示例代碼如下:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  fixedThreadPool.execute(new Runnable() { 
  public void run() { 
   try { 
   System.out.println(index); 
   Thread.sleep(2000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
 } 
 } 
}

因為線程池大小為3,每個任務輸出index后sleep 2秒,所以每兩秒打印3個數(shù)字。

定長線程池的大小最好根據(jù)系統(tǒng)資源進行設置。如Runtime.getRuntime().availableProcessors()

(3)  newScheduledThreadPool

創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行。延遲執(zhí)行示例代碼如下:

package test; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 
 scheduledThreadPool.schedule(new Runnable() { 
  public void run() { 
  System.out.println("delay 3 seconds"); 
  } 
 }, 3, TimeUnit.SECONDS); 
 } 
} 

表示延遲3秒執(zhí)行。

定期執(zhí)行示例代碼如下:

package test; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 
 scheduledThreadPool.scheduleAtFixedRate(new Runnable() { 
  public void run() { 
  System.out.println("delay 1 seconds, and excute every 3 seconds"); 
  } 
 }, 1, 3, TimeUnit.SECONDS); 
 } 
} 

表示延遲1秒后每3秒執(zhí)行一次。

(4) newSingleThreadExecutor

創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。示例代碼如下:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  singleThreadExecutor.execute(new Runnable() { 
  public void run() { 
   try { 
   System.out.println(index); 
   Thread.sleep(2000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
 } 
 } 
} 

結(jié)果依次輸出,相當于順序執(zhí)行各個任務。

你可以使用JDK自帶的監(jiān)控工具來監(jiān)控我們創(chuàng)建的線程數(shù)量,運行一個不終止的線程,創(chuàng)建指定量的線程,來觀察:

工具目錄:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe

運行程序做稍微修改:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService singleThreadExecutor = Executors.newCachedThreadPool(); 
 for (int i = 0; i < 100; i++) { 
  final int index = i; 
  singleThreadExecutor.execute(new Runnable() { 
  public void run() { 
   try { 
   while(true) { 
    System.out.println(index); 
    Thread.sleep(10 * 1000); 
   } 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
  try { 
  Thread.sleep(500); 
  } catch (InterruptedException e) { 
  e.printStackTrace(); 
  } 
 } 
 } 
} 

效果如下:

選擇我們運行的程序:

監(jiān)控運行狀態(tài)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

武安市| 万盛区| 南乐县| 双鸭山市| 筠连县| 刚察县| 襄垣县| 安福县| 龙岩市| 响水县| 江达县| 吴江市| 新源县| 长子县| 德令哈市| 广安市| 剑川县| 山东省| 根河市| 迁安市| 涟源市| 中山市| 上蔡县| 淄博市| 北安市| 楚雄市| 公主岭市| 景宁| 新宾| 托里县| 灌阳县| 赤城县| 内乡县| 阿拉尔市| 社旗县| 攀枝花市| 盐城市| 郓城县| 阜城县| 灵川县| 石泉县|