2010-06-05 17 views
39

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#currentTimeMillis() का कहना है:सिस्टम.currentTimeMillis हमेशा एक मूल्य> = पिछली कॉल वापस करेगा?

मिलीसेकेंड में वर्तमान समय देता है। ध्यान दें कि रिटर्न वैल्यू के समय की इकाई एक मिलीसेकंड है, जबकि मूल्य की ग्रैन्युलरिटी अंतर्निहित ऑपरेटिंग सिस्टम पर निर्भर करती है और यह बड़ी हो सकती है। उदाहरण के लिए, कई ऑपरेटिंग सिस्टम मिलीसेकंड के दसियों की इकाइयों में समय मापते हैं।

मुझे यह स्पष्ट नहीं है कि मुझे गारंटी है कि यह कोड हमेशा बढ़ते (या समान) संख्याओं को प्रिंट करेगा।

while (1) { 
    System.out.println(System.currentTimeMillis()); 
} 
+0

कृपया एक और हालिया लिंक का हवाला देते हुए विचार करें। – trashgod

+4

एफवाईआई - इस सवाल से पूछने का सटीक तरीका यह है कि 'currentTimeMillis' * monotonic * है। –

+2

तकनीकी रूप से, यह एकान्त रूप से बढ़ रहा है। मोनोटोनिक फ़ंक्शन या तो बढ़ रहे हैं या घट रहे हैं। –

उत्तर

45

कम जवाब नहीं है, System.currentTimeMillis()नहीं monotonic है। यह सिस्टम समय पर आधारित है, और इसलिए घड़ी समायोजन के मामले में भिन्नता (आगे या पिछड़ा) भिन्नता के अधीन हो सकता है (उदाहरण के लिए NTP के माध्यम से)।

System.nanoTime(), monotonic है अगर और अंतर्निहित मंच CLOCK_MONOTONIC का समर्थन करता है केवल अगर - कुछ परिस्थितियों जहां यह है/सच नहीं है पर एक अच्छा writeup के लिए Java bug report 6458294 पर टिप्पणियों को देखने।

(और, एक अतिरिक्त उपाख्यान के रूप में, मैंने व्यक्तिगत रूप से देखा है (कई बार) System.currentTimeMillis() घड़ी के समायोजन की अनुपस्थिति में, पीछे की तरफ दौड़ें, यानी, एक थ्रेड में उस विधि को कॉल करने से किसी अन्य धागे में कॉल की तुलना में कम मूल्य, भले ही यह 'रीयल-टाइम' में क्रोनोलॉजिकल रूप से हुआ हो)

यदि आपको एक monotonic स्रोत की आवश्यकता है, तो 0 mon35onएक मोनोटोनिसिटी का समर्थन करने वाले मंच पर आपका सबसे अच्छा विकल्प है।

+0

+1 जानकारीपूर्ण। क्या आप विस्तार से आगे बढ़ने के लिए 'currentTimeMillis() 'को" व्यक्तिगत रूप से मनाया "कैसे विस्तारित करेंगे? यह एक कठिन व्यवसाय की तरह दिखता है, और हेइजेनबर्ग दिमाग में आता है। क्या आपने किसी भी तरह अपने धागे सिंक्रनाइज़ किया था? और अभी भी पीछे की ओर चलने का समय देख सकता है? –

+2

सरल संस्करण यह है कि हमारे पास कुछ समय की नौकरियां थीं जो 'लंबी शुरुआत = System.currentTimeMillis()' को दबाती थीं, और फिर काम करने के लिए एक और थ्रेड निकाल दिया गया था, जो अंत में 'long end = System.currentTimeMillis()' अंत में था , और दोनों घटाया। बहुत ही कम चलने वाली नौकरियों के मामले में यह अंतर (असामान्य रूप से नहीं) नकारात्मक था। जब तक मैंने कुछ शोध नहीं किया और कोड में खोद दिया, तब तक यह मेरे बाहर नरक को भ्रमित कर दिया। :) – Cowan

+0

तो थ्रेड # 1 ने 'long startInCallingThread = Sys.cTM() 'किया था और उस मान को थ्रेड # 2 में पास कर दिया था, जो' Sys.cTM() - startInCallingThread' के लिए नकारात्मक मान प्राप्त करेगा? दिलचस्प। क्या आप शायद इसे वर्चुअल मशीन में चला रहे थे? और * घड़ी समायोजन की अनुपस्थिति *, क्या आपका मतलब केवल मैन्युअल समायोजन है या इसमें एनटीपी डिमन के कारण स्वचालित समायोजन भी शामिल होंगे? –

8

यह संभवतः गारंटी बढ़ रही हो सकता है, तथ्य यह है कि उपयोगकर्ता संभावित कॉल के बीच सिस्टम का समय बदल सकता है के आधार पर नहीं हो सकता।

इसके अलावा, बढ़ना जारी रहें क्योंकि यह युग के बाद मिलीसेकंड का प्रतिनिधित्व करता है। यदि यह सामान्य "दीवार समय" था, तो आपको लीप दिन या डेलाइट बचत परिवर्तन पर समय परिवर्तनों के बारे में चिंता करनी होगी।

+1

वास्तव में, यह आवधिक होने की गारंटी है। हर 2 9 2,277,020 वर्षों के बारे में, यह एक बहुत बड़ी संख्या के बाद एक बहुत बड़ी संख्या प्रिंट करेगा। – emory

1

@ मार्क रशकॉफ सही है; nanoTime() थोड़ा और अधिक विश्वसनीय हो सकता है।

परिशिष्ट: इन caveats पर ध्यान दें, @Steven Schlansker द्वारा उद्धृत।

+2

इस बारे में अवगत रहें हालांकि: http://stackoverflow.com/questions/510462/is-system-nanotime-completely-useless –

+0

@ स्टेवेन श्लान्स्कर: धन्यवाद, अच्छा संदर्भ। – trashgod

11

नहीं, यह हमेशा> = सभी पिछली कॉल नहीं होगी।

  • यह हर समय में वृद्धि नहीं हो सकता है अगर आप इसे एक ही धागे से जल्दी जल्दी में कई बार फोन (मैं जानता हूँ कि यह => = का हिस्सा है, लेकिन व्यवहार अक्सर लोगों को आश्चर्य)।

  • यदि आप इसे कई धागे से त्वरित उत्तराधिकार में कई बार कहते हैं, तो यह कई चीजें कर सकता है - यह कार्यान्वयन और यादृच्छिक मौका के आधार पर बहुत कम मात्रा में धागे में थोड़ी देर वापस जा सकता है।

  • सबसे गंभीरता से, यदि उपयोगकर्ता (दुर्लभ) या एनटीपी सिंक (संभावित रूप से आम) सिस्टम घड़ी को समायोजित करता है तो मूल्य बड़ी मात्रा में वापस जा सकता है।

7

यदि आप एक मूल्य चाहते हैं जो monotonicly बढ़ रहा है तो आप कुछ ऐसा कर सकते हैं।

public enum Time { 
    ; 
    private static long lastTime; 
    public synchronized static long increasingTimeMillis() { 
     long now = System.currentTimeMillis(); 
     if (now > lastTime) 
      return lastTime = now; 
     return ++lastTime; 
    } 
} 

जब तक आप प्रति सेकंड एक हज़ार बार की तुलना में यह कम कहते हैं, अपने को बढ़ाने के समय वास्तविक समय से बहुत दूर बहाव नहीं होगा लेकिन अनूठा होगा। (यह काम कर सकता है, भले ही आप अपना आवेदन पुनरारंभ करें)

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