2016-09-30 33 views
0
import java.util.Date; 

    import javax.xml.crypto.Data; 

    public class Task1 { 
    public static void main(String[] args) { 
     // run in a second 
     final long timeInterval = 4000; 
     Data now = null; 
     Runnable runnable = new Runnable() { 
     public void run() { 
      while (true) { 
      // ------- code for task to run 
      System.out.println("Hello !!"+new Date()); 
      for(int i=0;i<10000;i++){ 
       System.out.println("Hello !!"); 
      } 

      // ------- ends here 
      try { 
       Thread.sleep(timeInterval); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 

     }; 

     Thread thread = new Thread(runnable); 
     thread.start(); 
    } 
    } 

我閱讀了有關threads.I的調度想了解該代碼運行正常,並在4秒後,執行線程,但如果通過循環假設所花費的時間出來的教程爲1秒,那麼總時間將是1 + 4 5秒。 我不想執行器服務。只是正常的線程類。任何人都可以解釋這個程序是如何工作的。在了Thread.sleep java的時間程序器

回答

0

你是對的,sleep是除了已經在循環中花費的時間。

即使您計算了剩餘的睡眠時間,仍然可能需要更長的時間,因爲無法保證睡眠醒來的速度有多快。有時候可能是幾十毫秒。

ExecutorService所做的是計算何時應該從第一次運行中喚醒並確保不會累積任何延遲。它使用System.nanoTime(),因此掛鐘中的更正不會影響週期。

+0

我在一次採訪中被問到了這個問題,解決這個問題最好的辦法是在一定的時間間隔後執行一個線程,而不需要執行者 – coder25

+0

@ coder25顯然最好的方法是使用ScheduledExecutorService,或者做它做的事情, System.nanoTime()在開始時計算每次應該休眠多長時間以避免累積錯誤。如果掛鐘很重要,可以使用System.currentTimeMillis() –