[英]How can I replace an infinite loop in Java with an executor?
以前,我有一個帶有無限循環的線程,不斷使元素脫離隊列:
public void start() {
new Thread(task(), "Publish").start();
}
@SuppressWarnings("InfiniteLoopStatement")
private Runnable task() {
return () -> {
while (true) {
someMethodThatTakesFromAQueue();
}
};
}
現在我想使用ExecutorService,到目前為止我想出的最好的方法是
public void start() {
Executors.newScheduledThreadPool(1)
.scheduleWithFixedDelay(
this::someMethodThatTakesFromAQueue, 0, 1, TimeUnit.MICROSECONDS);
}
但是我不喜歡這樣的事實,當我實際上只是想永遠立即執行它時,我必須在兩次執行之間給予非零延遲,因為隊列上的事務會阻塞直到隊列上有要處理的作業。
還有其他選擇嗎?
還有其他可用的線程池,例如固定newFixedThreadPool
( newFixedThreadPool
),它的行為似乎與您使用的線程池相同,只是沒有進行調度。
為什么首先要使用ExecutionService,因為您只是在阻塞正在運行的任務,因此重用線程沒有任何好處,而創建和維護ExecutionService只是增加了額外的開銷,因此單個線程變得昂貴。
如果您想有意義地使用ExecutionService,而不是while(true)循環,則可以將新任務添加到ExecutionService中,它可以完成您需要的工作單元。 比起,要提高性能,您可以增加ExecutionService線程池的大小,以便2個任務可以並行運行,或者在其他地方重用此ExecutionService,否則將保留您編寫的Thread實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.