ThreadPoolExecutor使用例子:
public class Test1 { private ThreadPoolExecutor threadpool; /** * Param: * corePoolSize - 池中所保存的線程數,包括空閑線程。 * maximumPoolSize - 池中允許的最大線程數(采用LinkedBlockingQueue時沒有作用)。 * keepAliveTime -當線程數大於核心時,此為終止前多余的空閑線程等待新任務的最長時間,線程池維護線程所允許的空閑時間。 * unit - keepAliveTime參數的時間單位,線程池維護線程所允許的空閑時間的單位:秒 。 * workQueue - 執行前用於保持任務的隊列(緩沖隊列)。此隊列僅保持由execute 方法提交的 Runnable 任務。 * RejectedExecutionHandler -線程池對拒絕任務的處理策略(重試添加當前的任務,自動重復調用execute()方法) */ public Test1(){ threadpool=new ThreadPoolExecutor(2, 10, 20, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.DiscardOldestPolicy()); } //add task into thread pool public void submit(final int flag){ threadpool.execute(new Runnable(){ public void run(){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(flag + " Hello"); } }); } /** * close thread pool */ public void shutdown() { threadpool.shutdown(); } public static void main(String[] args) { Test1 t = new Test1(); for (int i = 0; i < 20; i++) { System.out.println("time:" + i); t.submit(i); } System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); } /** * 當一個任務通過execute(Runnable)方法欲添加到線程池時: * 1.如果此時線程池中的數量小於corePoolSize,即使線程池中的線程都處於空閑狀態,也要創建新的線程來處理被添加的任務。 * 2.如果此時線程池中的數量等於 corePoolSize,但是緩沖隊列 workQueue未滿,那么任務被放入緩沖隊列。 * 3.如果此時線程池中的數量大於corePoolSize,緩沖隊列workQueue滿,並且線程池中的數量小於maximumPoolSize,建新的線程來處理被添加的任務。 * 4.如果此時線程池中的數量大於corePoolSize,緩沖隊列workQueue滿,並且線程池中的數量等於maximumPoolSize,那么通過 * handler所指定的策略來處理此任務。也就是:處理任務的優先級為:核心線程corePoolSize、任務隊列workQueue、最大線程maximumPoolSize * ,如果三者都滿了,使用handler處理被拒絕的任務。 * * 5.當線程池中的線程數量大於corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態的調整池中的線程數。 */ }