[英]ScheduledExecutorService one thread many tasks
我是ExecutorService
新手,並想知道為什么下面的代碼正確打印“10 15”,即使我只創建了一個線程來處理超時? 為什么我可以多次調用調度而不在單個線程執行器上取消先前的任務?
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TestExecutorService implements Runnable {
public static ScheduledExecutorService SERVICE = Executors.newSingleThreadScheduledExecutor();
private int delay;
public TestExecutorService(int delay) {
this.delay = delay;
}
public void run () {
System.out.println(delay);
}
public static void main (String[] args) {
SERVICE.schedule(new TestExecutorService(10), 10, TimeUnit.SECONDS);
SERVICE.schedule(new TestExecutorService(15), 15, TimeUnit.SECONDS);
SERVICE.shutdown();
}
}
在這種情況下閱讀Javadoc非常有用。 它確實解釋了雖然執行程序將使用單個線程創建,但它將以無界隊列運行。 這意味着您可以向執行程序提交多個任務,它們將排隊等候一個接一個地運行,直到隊列的最大邊界(在這種情況下是無窮大)或直到JVM資源耗盡為止。
創建一個Executor,它使用一個在無界隊列中運行的工作線程。 (但請注意,如果此單個線程由於在關閉之前執行期間的故障而終止,則在需要執行后續任務時將使用新的線程。)保證任務按順序執行,並且不會有多個任務處於活動狀態在任何給定的時間。 與其他等效的newFixedThreadPool(1)不同,保證返回的執行程序不可重新配置以使用其他線程。
在您的示例中,您的兩個任務排隊,並依次順序運行,這就是您獲得(預期)輸出的原因。
來自Javadocs :
保證任務按順序執行,並且在任何給定時間不會有多個任務處於活動狀態。
“處理超時”和“任務執行”之間的區別是答案的關鍵。 您假設“單線程”意味着“一次只處理一個超時”,但它實際上意味着“一次只執行一個任務”。 所有超時都會同時處理,但如果在任務停止執行之前達到一個超時,則必須等待另一個超時才能執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.