我認爲使用ThreadPoolExecutor我們可以提交Runnable
s執行或者在構造函數中傳遞的BlockingQueue
或使用execute
方法。
另外我的理解是,如果任務可用,它將被執行。
什麼我不明白的是:ThreadPoolExecutor和隊列
public class MyThreadPoolExecutor {
private static ThreadPoolExecutor executor;
public MyThreadPoolExecutor(int min, int max, int idleTime, BlockingQueue<Runnable> queue){
executor = new ThreadPoolExecutor(min, max, 10, TimeUnit.MINUTES, queue);
//executor.prestartAllCoreThreads();
}
public static void main(String[] main){
BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>();
final String[] names = {"A","B","C","D","E","F"};
for(int i = 0; i < names.length; i++){
final int j = i;
q.add(new Runnable() {
@Override
public void run() {
System.out.println("Hi "+ names[j]);
}
});
}
new MyThreadPoolExecutor(10, 20, 1, q);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*executor.execute(new Runnable() {
@Override
public void run() {
System.out.println("++++++++++++++");
}
}); */
for(int i = 0; i < 100; i++){
final int j = i;
q.add(new Runnable() {
@Override
public void run() {
System.out.println("Hi "+ j);
}
});
}
}
}
此代碼沒有絕對任何事情,除非我要麼取消註釋構造函數中的executor.prestartAllCoreThreads();
或我稱之爲可運行的execute
,打印System.out.println("++++++++++++++");
(它也評論出)。
爲什麼?
報價(我的重點):
默認情況下,即使是最初創建核心線程和纔開始 當新任務到達,但可以使用動態 方法prestartCoreThread()或prestartAllCoreThreads覆蓋() 。如果您使用非空 隊列構建池,您可能需要 預啓動線程。
好的。所以我的隊列不是空的。但是我創建了executor
,我做了sleep
,然後我將新的Runnable
s添加到隊列中(在循環中爲100)。
這個循環不計爲new tasks arrive
?
爲什麼它不起作用,我必須要麼prestart
要麼明確地致電execute
?
工作線程是在任務通過'execute'到達時產生的,而這些線程是與底層工作隊列交互的。如果您從非空工作隊列開始,則需要預先啓動工作人員。請參閱[在OpenJDK 7中的實現](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/ThreadPoolExecutor.java)。 – oldrinb 2012-08-05 21:17:57
@veer:是的,我知道。但是我從一個非空隊列開始,然後開始添加到隊列中。爲什麼我需要預先啓動工人?爲什麼我需要每次都查看實施情況?規範是錯誤的或者我不理解它。那它是哪一個? – Cratylus 2012-08-05 21:18:59
同樣,工作人員是直接與隊列交互的人員。它們僅在通過'execute'(或其上面的圖層,例如'invokeAll','submit'等)傳遞時才按需生成。查看'execute'的代碼[here](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/ThreadPoolExecutor.java#1300 )。 – oldrinb 2012-08-05 21:21:35