[英]Why is the ScheduledExecutorService not working as expected?
[英]Thread Join + ScheduledExecutorService not working as expected
在下面的代碼片段中,我注意到以下執行順序。 為什么控件在完成someTask塊中的活動之前返回到someMethod()外部的流程? 它不應該在移動到下一行代碼之前完成 thread2 中的所有內容,因為已調用thread2.join()嗎?
System.out.prinltn("inside someMethod...");
System.out.println("after thread2 .....");
System.out.prinltn("inside someTask......");
public static void main(String args[]) {
Thread thread1 = new Thread(new someclassimplementingRunnable());
thread1.start();
try {
thread1.join();
Thread thread2 = new Thread(new Runnable() {
public void run() {
someMethod();
}
});
thread2.start();
thread2.join();
System.out.println("after thread2 .....");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("outside try-catch");
}
public static synchronized void someMethod(){
System.out.prinltn("inside someMethod...");
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Runnable someTask = () -> {
System.out.prinltn("inside someTask......");
};
executor.scheduleAtFixedRate(someTask , 0, 2, TimeUnit.SECONDS);
}
它按預期工作。 你只是在期待錯誤的結果;)
一旦執行程序開始工作,Thread2 就完成了它的工作,坦率地說,你能看到“inside someTask”真是個奇跡,因為執行程序和它的任務將在“someMethod”完成工作后被垃圾收集。 (即 Executor 在 someMethod 之外不會保持活動狀態,並且在等待 executor 完成的 someMethod 結束時沒有阻塞操作)。
我什至敢打賭,如果您運行此代碼足夠多次,那么由於隨機操作系統/進程調度,有時您將看不到“inside someTask”這一行。
沒有讓“someMethod”等待的行,因此 Thread2 完成其工作並通過 .join(),您會看到“在 thread2 之后”打印出來。
另外,請記住控制台不是同步 output 服務。 當多個線程將 output 發送到控制台時,它不能保證以相同的順序出現。 所以它不能很好地指示多線程環境中的事件順序。
我找到了解決方案,實際上它非常簡單,檢查條件while(.executor.isTerminated())完成工作。 它確保僅在執行程序完成其工作后才執行下一條語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.