2010-04-30 11 views
5

की वजह से एक गलत समय क्रियान्वित मैं एक ScheduledThreadPoolExecutor वस्तु का उपयोग कर एक काम का समय निर्धारण कर रहा हूँ। मैं निम्न विधि का उपयोग:ScheduledThreadPoolExecutor CPU समय विसंगति

public ScheduledFuture<?> schedule(Runnable command, long delay,TimeUnit unit) 

और 30 सेकंड (देरी = 30,000 और इकाई = TimeUnit.MILLISECONDS) करने के लिए देरी निर्धारित किया है। कभी-कभी मेरा कार्य तुरंत होता है और दूसरी बार इसमें 70 सेकंड लगते हैं।

मेरा मानना ​​है कि ScheduledThreadPoolExecutor सीपीयू विशिष्ट घड़ियों का उपयोग करता है। जब मैं System.currentTimeMillis(), System.nanoTime() [जो CPU विशिष्ट है] की तुलना परीक्षण चलाने मैं निम्नलिखित

अनुसूची देखें: 1272637682651ms, 7858346157228410ns

निष्पादित करें: 1272637682667ms, 7858386270968425ns

का अंतर है 16ms लेकिन 4011374001ns (या 40,113ms)

तो यह लग रहा है 40 सेकंड

के दो सीपीयू घड़ियों के बीच विसंगति मैं कैसे इस समस्या को हल करना है की तरह मैं एन जावा कोड? दुर्भाग्य से यह एक ग्राहक मशीन है और मैं अपने सिस्टम को संशोधित नहीं कर सकता।

+0

ट्रिकी एक। शायद 'java.util.Calendar' मददगार होगा? कैलेंडर.getInstance() और बहुत आगे .. –

+1

क्या आप इस कोड को एक वायरल मशीन (वीएमवेयर, केवीएम, वर्चुअल पीसी) पर चला रहे हैं? वर्चुअलाइजेशन, मिलीसेकंद स्तर पर भी CPU घड़ी के साथ विनाश का कारण बन सकता है। –

+0

यह सीधे एक विंडोज एक्सपी पेशे मशीन पर चल रहा है। कोई वर्चुअलाइजेशन नहीं – richs

उत्तर

2

हां, आप सही हैं कि अनुसूचित थ्रेडपूलएक्सएटर सिस्टम System.nanoTime() का उपयोग करता है। और आप यह भी सही हैं कि System.nanoTime() विशेष सिस्टम उदाहरण पर निर्भर है। यदि आपकी प्रक्रिया अनुसूची और निष्पादन के बीच माइग्रेट करने के लिए होती है, तो आप भाग्य से बाहर हैं। (मुझे नहीं लगता कि एक बहु-सीपीयू सिस्टम पर सीपीयू के बीच माइग्रेट करना कोई फर्क नहीं पड़ता, लेकिन शायद यह करता है? निश्चित रूप से इससे कोई फर्क नहीं पड़ता कि आप वीएम में चल रहे हैं और मेजबानों के बीच माइग्रेट किए गए वीएम)।

मुझे लगता है कि इस मामले में एकमात्र वास्तविक समाधान अनुसूचित थ्रेडपूलएक्सएटरेटर के अलावा कुछ और उपयोग करना है ... यह केवल शेड्यूल किए गए थ्रेडपूलएक्सएटर.ओएन() को बदलना आसान नहीं है। सार QQuedSynchronizer $ ConditionObject.awaitNanos() System.nanoTime() का भी उपयोग करता है।

मेरी परियोजनाओं में से एक नौकरी शेड्यूलिंग के लिए Quartz का उपयोग करता है और मैंने उस लाइब्रेरी के साथ आपके द्वारा वर्णित समस्या को कभी नहीं देखा है। मैं कार्यान्वयन विवरण नहीं जानता (शायद यह सिर्फ System.nanoTime() का उपयोग करता है, लेकिन शायद नहीं?)।

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