2016-12-04 100 views
0

我有一個Java線程執行如下命令:爲什麼Java線程不會超時

class MyThread extends Thread { 
    private static Integer counter = 1; 

    public MyThread(final String name) { 
     super(name + "_" + counter); 
     counter++; 
    } 

    @Override 
    public void run() { 
     try { 
      sleep(0,2); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(this.getName() + " true = " + true); 
    } 
} 

和主類,如下所示:

public class ThreadingTest { 

    public static void main(String[] args) { 
     MyThread thisThread = new MyThread("MyThread"); 
     thisThread.setDaemon(true); 
     thisThread.start(); 
     try { 
      Thread.sleep(0,1); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

但是即使線程處於休眠狀態的2納秒並且調用線程僅睡1納秒,爲什麼我的SOUT打印語句?

考慮到被調用線程的超時大於調用線程的事實,調用線程在打印語句前是否應該終止?

+0

您將線程設置爲守護進程將導致您的線程處於後臺而不是前臺。 – Shriram

+2

@Shriram不,這不是什麼setDaemon。前景和背景的概念甚至不存在。 –

+1

線程調度程序可自由調度線程的方式。而一納秒是非常非常少的時間。讓線程睡幾毫米,你應該開始看到你的期望。 –

回答

0

使用Thread.sleep()不能達到納秒精度。即使執行這些指令也需要超過一個納秒。用毫秒代替你的代碼,看看它是否有效!

+1

「只需調整數字直到它工作」在穿線時是可怕的,可怕的建議。 – Voo

+1

不,建議是關於Thread.sleep()沒有納秒分辨率,這就解釋了爲什麼代碼無法按預期工作。如果你把毫秒或秒,它將作爲一個概念證明。如果你根據你的應用程序邏輯,這當然是另一個問題(答案確實是否定的) – Lucian

+0

是的,我的抱怨是,即使睡眠的納秒精度,這個代碼仍然不能保證工作。你說如果OP使用毫秒,這將會起作用。但是,如果您在不同的操作系統,硬件配置和軟件設置上嘗試一毫秒,您會發現在錯誤的地方存在很多問題。嘗試15毫秒,你減少了失敗,但我仍然可以輕鬆地生成代碼將失敗的系統。唯一正確的答案是代碼被破壞,其行爲未指定 – Voo

1

當所有非守護進程線程完成時,標記爲守護進程的線程將被終止。因此,你的線程簡單地被殺死。 What is Daemon thread in Java?

+0

這是不正確的。 Deamon線程將像正常線程一樣運行(並且不會被殺死)。最大的區別是Deamon線程不會阻止JVM退出。如果它停留在保持活動循環中,並且不會手動終止它,它甚至會永遠運行。 – n247s

+0

因此,鏈接問題甚至JDK doc中的所有帖子都是錯誤的? – brummfondel

0

方法Thread.sleep只確定線程休眠的時間量(線程處於TIMED_WAITING狀態的時間長度)。在這段時間之後,線程將從等待線程集中移除,但仍需等待以獲取CPU時間。需要多長時間是非確定性參數。您絕不應該依賴時間來確定線程執行的確切順序。

+0

如果我需要確定線程執行的確切順序,請您指出正確的方向。 – dissatisfiedprogrammer

+0

您必須使用以Java語言構建的同步機制,例如:[Semaphore](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html)或[CountDownLatch ](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)非常有用。閱讀關於使用** synchronized **子句。這只是開始。 –

相關問題