執行緒池建立

2021-09-11 21:46:10 字數 2576 閱讀 3351

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 如果可用 將重用...