簡體   English   中英

如何用執行程序替換Java中的無限循環?

[英]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);
}

但是我不喜歡這樣的事實,當我實際上只是想永遠立即執行它時,我必須在兩次執行之間給予非零延遲,因為隊列上的事務會阻塞直到隊列上有要處理的作業。

還有其他選擇嗎?

還有其他可用的線程池,例如固定newFixedThreadPoolnewFixedThreadPool ),它的行為似乎與您使用的線程池相同,只是沒有進行調度。

為什么首先要使用ExecutionService,因為您只是在阻塞正在運行的任務,因此重用線程沒有任何好處,而創建和維護ExecutionService只是增加了額外的開銷,因此單個線程變得昂貴。

如果您想有意義地使用ExecutionService,而不是while(true)循環,則可以將新任務添加到ExecutionService中,它可以完成您需要的工作單元。 比起,要提高性能,您可以增加ExecutionService線程池的大小,以便2個任務可以並行運行,或者在其他地方重用此ExecutionService,否則將保留您編寫的Thread實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM