java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?
在一些非常狹窄的情況下,您可以實現一個java.util.concurrent.RejectedExecutionHandler,它可以滿足您的需要。
RejectedExecutionHandler block = new RejectedExecutionHandler() {
rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
executor.getQueue().put( r );
}
};
ThreadPoolExecutor pool = new ...
pool.setRejectedExecutionHandler(block);
現在。這是一個很壞的主意,原因如下
>它很容易死鎖,因為池中的所有線程可能會死在你放入隊列的東西是可見的。通過設置合理的保活時間來緩解這一點。
>任務不包裹你的執行者可能期望的方式。許多執行器實現在執行之前將其任務封裝在某種跟蹤對象中。看看你的來源。
> API強烈不建議通過getQueue()添加,并且可能在某些時候禁止。
一個幾乎總是更好的策略是安裝ThreadPoolExecutor.CallerRunsPolicy,它將通過在調用execute()的線程上運行任務來調節你的應用程序。
然而,有時一個擁有所有內在風險的封鎖策略,實際上是你想要的。我會說在這些條件
>你只有一個線程調用execute()
>你必須(或想)有一個非常小的隊列長度
>你絕對需要限制運行此工作的線程數量(通常出于外部原因),而調用者運行策略會破壞它。
>你的任務是不可預測的大小,所以調用者運行可能會引入饑餓,如果池暫時忙于4個短任務,你的一個線程調用執行卡住了一個大。
所以,我說。它很少需要,可能是危險的,但你去。
祝你好運。
總結
以上是生活随笔為你收集整理的java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ftp 读取 txt文件_ja
- 下一篇: java 1.6 webservice_