最新国产好看的视频,伊人天堂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)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。

newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(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); 
  } 
  }); 
 } 
 } 
} 

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

(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,每個任務(wù)輸出index后sleep 2秒,所以每兩秒打印3個數(shù)字。

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

(3)  newScheduledThreadPool

創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(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í)行任務(wù),保證所有任務(wù)按照指定順序(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é)果依次輸出,相當(dāng)于順序執(zhí)行各個任務(wù)。

你可以使用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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

佛坪县| 绥化市| 潮州市| 闸北区| 丰城市| 吉木萨尔县| 海安县| 葵青区| 繁昌县| 克东县| 凤凰县| 长葛市| 南平市| 宁南县| 台南县| 堆龙德庆县| 扶余县| 高青县| 乌鲁木齐县| 九江县| 樟树市| 吴川市| 门源| 城固县| 吐鲁番市| 洛南县| 布拖县| 潼关县| 缙云县| 龙井市| 宁海县| 伊川县| 太康县| 石景山区| 定州市| 汤阴县| 宿州市| 宁河县| 西安市| 泰兴市| 洛扎县|