我正在嘗試使用 ScheduledExecutorService 在給定的執行緒池上安排任務。
public ScheduledExecutorService scheduledExecutorService() {
return Executors.newScheduledThreadPool(3);
}
看起來這種創建實體的方式假定用戶指定的值是最小執行緒數,最大執行緒數將是Integer.MAX_VALUE(默認值)。
如何為 ScheduledExecutorService 的實體指定最大執行緒數?我不能分配如此大量的執行緒作為最大執行緒數。
來自反編譯 jar 的序列中的代碼片段 -
// From Executors.java
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
// From ScheduledThreadPoolExecutor.java
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
// From ThreadPoolExecutor.java
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
如果我沒有在 Java 檔案中參考某個方法,請指出正確的位置。TIA。
uj5u.com熱心網友回復:
ConstructorofScheduledThreadPoolExecutor不直接提供該引數的設定。您可以手動呼叫setMaximumPoolSize方法:
public ScheduledExecutorService scheduledExecutorService() {
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(corePoolSize);
scheduledThreadPoolExecutor.setMaximumPoolSize(xxx);
return scheduledThreadPoolExecutor;
}
但是在 中設定 thismaximumPoolSize是沒有意義的ScheduledThreadPoolExecutor ,這就是建構式沒有宣告這個引數的原因。
來自 Java 檔案ScheduledThreadPoolExecutor :
雖然這個類繼承自 ThreadPoolExecutor,但一些繼承的調優方法對它沒有用。特別是,因為它使用 corePoolSize 執行緒和無界佇列充當固定大小的池,所以調整 maximumPoolSize 沒有任何有用的效果。此外,將 corePoolSize 設定為零或使用 allowCoreThreadTimeOut 幾乎從來都不是一個好主意,因為一旦它們有資格運行,這可能會使池沒有執行緒來處理任務。
更多詳細資訊,請參閱delayedExecute并ensurePrestart在ScheduledThreadPoolExecutor,maximumPoolSize是無用的。
private void delayedExecute(RunnableScheduledFuture<?> task) {
if (isShutdown())
reject(task);
else {
// add task to queue
super.getQueue().add(task);
if (isShutdown() &&
!canRunInCurrentRunState(task.isPeriodic()) &&
remove(task))
task.cancel(false);
else
ensurePrestart();
}
}
void ensurePrestart() {
int wc = workerCountOf(ctl.get());
if (wc < corePoolSize)
addWorker(null, true);
else if (wc == 0)
addWorker(null, false);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359313.html
上一篇:當執行緒不拋出例外時會發生什么?
下一篇:監控提交到執行緒池的任務是否超時
