自定義執行緒池阻塞式提交任務

2021-08-17 20:17:34 字數 1511 閱讀 5451

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,...