2013-03-13 41 views
1

我在java中的ScheduledExecutorService有一個問題(我沒有面對這個問題幾天回來是什麼讓我很奇怪)。請找到下面的代碼和控制檯輸出。重複執行任務之間的延遲時間爲1毫秒,所以理想情況下,我應該每秒達到1000的計數(給或幾毫秒),但這種情況只是沒有發生。請幫助..調度執行器的準確性

CODE:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 


public class SchedulerTest { 

    private static final ScheduledExecutorService executor =  Executors.newScheduledThreadPool(2); 
    static DateFormat df= new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS"); 

    private static class TestRunnable1 implements Runnable{ 
     private int count=0; 

     @Override 
      public void run() { 
      count++; 
      if(count1 % 1000==0){ 
       System.out.println(count1+" "+df.format(Calendar.getInstance().getTime())); 
      } 

     } 
    } 


    public static void main(String[] args){ 
     Runnable localService = new TestRunnable1(); 
     try{ 
      executor.scheduleWithFixedDelay(localService, 0, 1, TimeUnit.MILLISECONDS); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

控制檯輸出

1000年3月13 2013 14:43:54.477 2000年3月13 2013 14:44:10.296 3000 13- Mar 2013 2013 - 三月2013 14:44:26.381 4000 2013年3月13日14:44:42.621 5000 13-Mar-2013 14:44:55.907 6000 13-Mar-2013 14:44:58.516 7000 13-Mar- 2013 14:45:05.896 8000 13-Mar-2013 14:45:10.292 9000 13-Mar-201 3 14:45:15.129 10000年3月13 2013 14:45:18.187

感謝, 阿比納夫

+0

這不是你正在運行的代碼(不編譯)。修復編譯時,我會在每次打印之間獲得大約1.2-1.3秒的時間,如果時間包括調度程序中的內務管理,這似乎是合理的。如果我更改爲scheduleAtFixedRate,那麼我會在第二次打印時發現(至少在毫秒級別上進行測量時)。 – 2013-03-13 07:17:00

+0

謝謝!你的建議工作:) – user2064123 2013-03-13 08:14:04

回答

1

你想用ScheduledExecutorService#scheduleAtFixedRate而非ScheduledExecutorService#scheduleWithFixedDelay

如果你有固定的延時安排,1毫秒的時間必須在最後一次執行完成的時間和下一次開始執行的時間之間的時間間隔。因此,完成1000次迭代所需的掛鐘時間至少爲1秒千次迭代的執行時間。

+0

謝謝你的工作!我應該徹底閱讀這個API :) – user2064123 2013-03-13 08:13:37