2012-07-03 16 views
7

मैं इस सरल कोड का टुकड़ा:ScheduledThreadPoolExecutor हो रही देर से

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(10); 

    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      System.err.println(Calendar.getInstance().getTime()); 
     } 
    }; 

    exec.scheduleAtFixedRate(r,0, 500, TimeUnit.MILLISECONDS); 
} 

एक मशीन पर, इस कोड अपेक्षित ढंग से चलाता है। कंसोल आउटपुट:

  • मंगल जुला 03 10:32:34 EEST 2012
  • मंगल जुला 03 10:32:34 EEST 2012
  • मंगल जुला 03 10:32:35 EEST 2012
  • मंगल जुला 03 10:32:35 EEST 2012
  • मंगल जुला 03 10:32:36 EEST 2012
  • मंगल जुला 03 10:32:36 EEST 2012 ...

हालांकि किसी अन्य मशीन पर, कंसोल पर टाइमस्टैम्प दिखाता है शेड्यूल किए गए थ्रेडपूलएक्सएटर को देर हो रही है। देर हो रही करके मैं सेकंड के एक जोड़े :)

  • मंगल जुला 03 10:32:34 EEST 2012
  • मंगल जुला 03 10:32:37 EEST 2012
  • मंगल जुला 03 10:32 मतलब है: 40 EEST 2012
  • मंगल जुला 03 10:32:44 EEST 2012
  • मंगल जुला 03 10:32:50 EEST 2012
  • मंगल जुला 03 10:32:55 EEST 2012 ...
जिस पर कोड सफलतापूर्वक चलता पहली मशीन का

विवरण:

i3 विंडोज 7 64 बिट JRE 1.6.0.30

दूसरी मशीन का विवरण जो शेड्यूलिंग पर देरी से चल रही:

डुअल कोर Windows XP 32 बिट जेआरई 1.6.0.18

मुझे आश्चर्य है कि ऐसा अंतर क्यों है। कोई सुझाव ?

अग्रिम धन्यवाद।

+1

क्या आप पर्यावरण (ओएस, जेवीएम) के बारे में अधिक जानकारी दे सकते हैं? – assylias

+0

शेड्यूलिंग देरी करने के लिए ओएस लेवल सिस्टम कॉल का उपयोग करती है, इसलिए यदि यह गलत है, तो आपके पास निम्न स्तर की समस्या है। –

+2

आप कम से कम दो होस्टों के कुल CPU उपयोग शामिल कर सकते हैं। –

उत्तर

1

वास्तव में अनुसूची टाइमर सटीक नहीं है, यह सीपीयू टिकों द्वारा समय की गणना करता है। इसलिए यदि आपका मशीन लोड बहुत भारी है, तो कुछ देरी हो सकती है। अपनी दूसरी मशीन के लोड की जांच करें!

संबंधित मुद्दे