executors執行緒池建立,主要包含以下幾種方式:
1、第一種:
/**
* 測試: 提交15個執行時間需要3秒的任務,看執行緒池的狀況
* * @param threadpoolexecutor 傳入不同的執行緒池,看不同的結果
* @throws exception
*/public void testcommon(threadpoolexecutor threadpoolexecutor) throws exception catch (interruptedexception e)
}});
system.out.println("任務提交成功 :" + i);
}// 檢視執行緒數量,檢視佇列等待數量
thread.sleep(500l);
system.out.println("當前執行緒池執行緒數量為:" + threadpoolexecutor.getpoolsize());
system.out.println("當前執行緒池等待的數量為:" + threadpoolexecutor.getqueue().size());
// 等待15秒,檢視執行緒數量和佇列數量(理論上,會被超出核心執行緒數量的執行緒自動銷毀)
thread.sleep(15000l);
system.out.println("當前執行緒池執行緒數量為:" + threadpoolexecutor.getpoolsize());
system.out.println("當前執行緒池等待的數量為:" + threadpoolexecutor.getqueue().size());
}/**
* * @throws exception
*/private void threadpoolexecutortest1() throws exception
通過executors.newfixedthreadpool()建立:
以上兩種方式都可以,只是executors提供了相應的封裝,簡化了部分過程。
通過執行結果分析所得:
核心執行緒數為5,最大執行緒數不起作用,超出執行緒會在linkedblockingqueue佇列中等待。每次執行會從佇列中取出任務執行。
第三種:
// executors工具類建立
// executorservice executorservice = executors.newcachedthreadpool();
// 和executors.newcachedthreadpool()一樣的
threadpoolexecutor threadpoolexecutor = new threadpoolexecutor(0, integer.max_value, 60l, timeunit.seconds,
new synchronousqueue());
testcommon(threadpoolexecutor);
// 預計結果:
// 1、 執行緒池執行緒數量為:15,超出數量的任務,其他的進入佇列中等待被執行
// 2、 所有任務執行結束,60秒後,如果無任務可執行,所有執行緒全部被銷毀,池的大小恢復為0
該執行緒處理一些不能預期到底需要建立幾個執行緒,通過資料大小來自己建立,最大為 integer.max_value,但是不建議這樣使用,如果執行緒太多,將造成執行卡屯嚴重,影響體驗。
執行結果:
該任務到點後執行一次後將不在執行,可以通過標示類控制,執行一次後關閉該任務。
/**
* * @throws exception
*/private void threadpoolexecutortest8() throws exception
});// 測試: 提交15個執行時間需要3秒的任務,看超過大小的2個,對應的處理情況
testcommon(threadpoolexecutor);
// 1秒後終止執行緒池
thread.sleep(1000l);
listshutdownnow = threadpoolexecutor.shutdownnow();
// 再次提交提示失敗
threadpoolexecutor.submit(new runnable()
});system.out.println("未結束的任務有:" + shutdownnow.size());
// 結果分析
// 1、 10個任務被執行,3個任務進入佇列等待,2個任務被拒絕執行
// 2、呼叫shutdownnow後,佇列中的3個執行緒不再執行,10個執行緒被終止後丟擲interrupted異常,2個任務被拒絕執行
}
執行緒池 Executors類建立執行緒池
executors靜態工廠建立幾種常用執行緒池 1.建立了乙個固定執行緒數量的執行緒池,可以控制線程最大併發數,超出的執行緒會在佇列中等待。newfixedthreadpool int nthreads 執行緒池中線程數量是要指定傳入的,注意在固定大小的執行緒池中使用的阻塞佇列是linkedbloc...
執行緒池建立方式及執行緒池原理
執行緒池提交任務時的執行順序如下 向執行緒池提交任務時,會首先判斷執行緒池中的執行緒數是否大於設定的核心執行緒數,如果不大於,就建立乙個核心執行緒來執行任務。如果大於核心執行緒數,就會判斷緩衝佇列是否滿了,如果沒有滿,則放入佇列,等待執行緒空閒時執行任務。如果佇列已經滿了,則判斷是否達到了執行緒池設...
ExecutorService建立執行緒池
一 executorservice executorservice executors.newcachethreadpool 根據需要建立乙個新的執行緒池,不過以前建立的執行緒池可用時則復用以前建立的執行緒池。這些池通常會提高執行的很多短期非同步任務的程式的效能。呼叫execute 如果可用 將重用...