用Executors工具類建立線程池

  多線程技術主要解決處理器單元內多個線程執行的問題,它能夠顯著減小處理器單元的閒置時間,增長處理器單元的吞吐能力。  java

  線程池主要用來解決線程生命週期開銷問題和資源不足問題。經過對多個任務重用線程,線程建立的開銷就被分攤到了多個任務上了,並且因爲在請求到達時線程已經存在,因此消除了線程建立所帶來的延遲。這樣,就能夠當即爲請求服務,使應用程序響應更快。另外,經過適當地調整線程池中的線程數目能夠防止出現資源不足的狀況。
安全

  JDK5中提供的Executors工具類能夠經過4個靜態方法建立4種線程池,以下所示:多線程

  (1)Executors.newCachedThreadPool();ide

public static ExecutorService newCachedThreadPool(){
    return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>());
}

     

  • 它是一個能夠無限擴大的線程池;
  • 它比較適合處理執行時間比較小的任務;
  • corePoolSize爲0,maximumPoolSize爲無限大,意味着線程數量能夠無限大;
  • keepAliveTime爲60S,意味着線程空閒時間超過60S就會被殺死;
  • 採用SynchronousQueue接收請求任務,這個阻塞隊列沒有存儲空間,這意味着只要有請求到來,就必需要找到一條工做線程處理予以,若是當前沒有空閒的線程,就會再建立一條新的線程。
   (2)Executors.newFixedThreadPool ();
public static ExecutorService newFixedThreadPool(int nThreads){
    return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}

    

  • 它是一種固定大小的線程池;
  • corePoolSize和maximunPoolSize都爲用戶設定的線程數量nThreads;
  • keepAliveTime爲0,意味着一旦有多餘的空閒線程,就會被當即中止掉;但這裏keepAliveTime無效;
  • 阻塞隊列採用了LinkedBlockingQueue,它是一個無界隊列;
  • 因爲阻塞隊列是一個無界隊列,所以永遠不可能拒絕任務;
  • 因爲採用了無界隊列,實際線程數量將永遠維持在nThreads,所以maximumPoolSize和keepAliveTime將無效。
  (3)Executors.newScheduledThreadPool();

   它用來處理延時任務或定時任務。工具

  它接收SchduledFutureTask類型的任務,有兩種提交任務的方式:spa

  ①scheduledAtFixedRate線程

  ②scheduledWithFixedDelay3d

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

   表示延遲3秒執行。   blog

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS); 

   表示延遲1秒後每3秒執行一次。 生命週期

  ScheduledExecutorService比Timer更安全,功能更強大。

  (4)Executors.newSingleThreadExecutor();  

public static ExecutorService newSingleThreadExecutor(){
    return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
} 

 

  建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。

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();
}
}
});
} 

   結果依次輸出,至關於順序執行各個任務。

  現行大多數GUI程序都是單線程的。

  線程池的做用:

  減小了建立和銷燬線程的次數,每一個工做線程均可以被重複利用,可執行多個任務。根 據系統的環境狀況,能夠自動或手動設置線程數量,從而達到運行的最佳效果。

相關文章
相關標籤/搜索