簡體   English   中英

Thread Join + ScheduledExecutorService 未按預期工作

[英]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.

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