public class contentindexbuilder ,這種拒絕執行策略在任務佇列滿後會使任務在呼叫執行緒中執行)
* * 這種方式可以避免任務無限制的迅速提交,同時避免任務的放棄
*/private final static int n_threads = 5;
private final static int queue_capacity = 20;
private final executorservice es = new threadpoolexecutor(n_threads, n_threads, 0l, timeunit.milliseconds,
new linkedblockingqueue(queue_capacity), new blockingrejectedexecutionhandler());
public contentindexbuilder()
/*** databean生產線程
* * @author hasee
* */
private class producer implements runnable
}} private listgettask()
/*** 阻塞式方法,直到返回true
* * 不要遞迴實現,容易棧溢位
* * @return
*/private boolean isworkingtime() catch (interruptedexception e)
}return true;
} private boolean istime()
} private class consumer implements runnable
@override
public void run() catch (exception e)
} }/**
* 自定義拒絕執行策略:阻塞式地將任務新增至工作佇列中
* * @author hasee
* */
private class blockingrejectedexecutionhandler implements rejectedexecutionhandler catch (interruptedexception e)
}} }
}
執行緒池儲存任務的佇列一般是有界的,那麼當任務佇列已滿時,新的任務怎麼處理呢?
這就要看執行緒池採用的是那種拒絕策略了。threadpoolexecutor中提供了四種拒絕策略,分別是:
callerrunspolicy:使用呼叫執行緒執行該任務
abortpolicy:丟擲異常並放棄任務
discardpolicy:直接放棄任務
discardoldestpolicy:放棄舊任務,新增該任務到任務佇列
這裡我們自定義了一種拒絕策略,即阻塞式新增。當任務佇列已滿時,呼叫執行緒會阻塞,直到任務佇列有空位,新增。這種方式不會丟失任務。(其實callerrunspolicy也不會丟失任務)
自定義執行緒池
有些時候 jdk自帶的cachedthreadpool fixedthreadpool等執行緒池完成不了我們業務的需求時 可以用threadpoolexecutorg構造自定義的執行緒池。public class usethreadpoolexecutor1 這段 會首先執行任務1,然後把2 3 4...
自定義執行緒池
建立執行緒池方法 儘管executors提供了四種執行緒池建立的方式,但為了實現某些特定的需求,可以自己建立執行緒池。如在阿里的程式設計規範使用executors建立執行緒時,一般會報錯,並提示以下資訊 執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式,...
自定義執行緒池
自定義執行緒池建立api 執行緒池建立通過juc的介面 executor 實現,平時我們使用其實現類 threadpoolexecutor 實現自定義執行緒池。常用建構函式 public threadpoolexecutor int corepoolsize,int maximumpoolsize,...