2012-10-29 13 views
9

का उपयोग करके हर सेकेंड कोड चलाएं I System.currentTimeMillis(); का उपयोग कर हर सेकेंड कोड को चलाने की कोशिश कर रहा हूं।System.currentTimeMillis()

कोड:

 while(true){ 
      long var = System.currentTimeMillis()/1000; 
      double var2 = var %2; 

      if(var2 == 1.0){ 

       //code to run 

      }//If(): 

     }//While 

कोड जो मैं चलाना चाहते हैं, क्योंकि कई बार var2 अनंत पूरे पाश की वजह से 1.0 से अधिक बार के लिए सेट है चलाता है। मैं सिर्फ कोड लाइन को चलाने के लिए चाहता हूं जब var2 पहले 1.0 पर सेट हो, और फिर हर बार फिर जब var2 0.0 के बाद 1.0 हो जाता है।

+1

मुझे वास्तव में आपके जैसे लूप और निर्णयों पर टिप्पणी डालना शुरू करना चाहिए। इसके लिए अच्छा किया। – Andy

+1

@ एंडी - कृपया इस तरह के ब्रेसिज़ को बंद करने पर टिप्पणियां न दें।अपने आईडीई के "शो मिलान ब्रैकेट" का उपयोग करें और/या कोड को दोबारा दोहराएं ताकि आपके पास ऐसे ब्लॉक न हो जो आपको * करने की आवश्यकता हो। –

+0

@StephenC, मुझे लगता है एंडी व्यंग्यात्मक था। उनकी टिप्पणी ओपी के लिए बहुत उपयोगी नहीं थी। –

उत्तर

14

यदि आप सेकंड को बदलने के लिए प्रतीक्षा करना चाहते हैं तो आप निम्न का उपयोग कर सकते हैं।

long lastSec = 0; 
while(true){ 
    long sec = System.currentTimeMillis()/1000; 
    if (sec != lastSec) { 
     //code to run 
     lastSec = sec; 
    }//If(): 
}//While 

एक और अधिक कुशल दृष्टिकोण अगले दूसरे तक सोना है।

while(true) { 
    long millis = System.currentTimeMillis(); 
    //code to run 
    Thread.sleep(1000 - millis % 1000); 
}//While 

एक वैकल्पिक एक ScheduledExecutorService

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); 

ses.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     // code to run 
    } 
}, 0, 1, TimeUnit.SECONDS); 

// when finished 
ses.shutdown(); 

उपयोग करने के लिए इस दृष्टिकोण का लाभ यह है कि

  • आप एक ही धागे को बांटने अलग-अलग समय के साथ कार्यों की एक संख्या हो सकती है है।
  • आपके पास गैर-दोहराने वाली देरी या असीमित कार्य हो सकते हैं।
  • आप परिणाम को अन्य थ्रेड में एकत्र कर सकते हैं।
  • आप एक कमांड के साथ थ्रेड पूल को बंद कर सकते हैं।
+0

का नया थ्रेड पूल धन्यवाद। मैंने पहले विकल्प का उपयोग किया था जिसे आपने अनुसूचितExecutorService के लिए – Human

+0

+1 दिया था। – Twinone

2

आपको java.util.Timer और java.util.TimerTask कक्षा का उपयोग करना होगा।

+2

यदि कोड यूआई थ्रेड में नहीं है (स्पष्ट कारण के लिए) वह थ्रेड.sleep – Igor

+2

का उपयोग भी कर सकता है विरासत टाइमर और टाइमर कार्य API भयानक हैं। कोई साइन अप अपवाद नहीं है और एक बार अपवाद होता है, तो संपूर्ण टाइमर थ्रेड मारा जाता है। आपको इसे फिर से चलाने की ज़रूरत होगी। यह सिस्टम घड़ी में बदलावों के प्रति भी संवेदनशील है, आपको सिस्टम घड़ी को अनछुए करना होगा (और डीएसटी बंद करना होगा!)। आधुनिक जावा उपयोग समवर्ती निष्पादक सेवा एपीआई में उन अनोखी समस्याएं नहीं हैं। – BalusC

1

Thread.sleep(); का उपयोग आपके मामले के लिए बिल्कुल सही होगा।

while(true) 
{ 
    Thread.sleep(1000); // Waiting before run. 
    // Actual work goes here. 
} 
+0

यह हर सेकेंड नहीं चलाता है। यह पूरा होने के बाद एक सेकंड इंतजार कर रहा है। रन स्वयं को 0 सेकंड नहीं लेता है। कल्पना करें कि रन 200ms लेता है, तो इसे वास्तव में 800ms की प्रतीक्षा करनी चाहिए। इसके बजाए जावा उपयोग समवर्ती निष्पादक सेवा का उपयोग करें। – BalusC

+0

धन्यवाद, लेकिन मैं हर सेकेंड जावा मुख्य वर्ग को रोकना नहीं चाहता हूं। System.currentTimemillis के साथ ऐसा करने का कोई तरीका? – Human

+0

@ बाल्लूसी आप सही हैं। लेकिन यह जवाब सिर्फ ओपी को टिप देने के लिए है। उसे सोने का समय कॉन्फ़िगर करना चाहिए। – Juvanis

3

मैं जावा executor पुस्तकालयों का उपयोग करता हूं। आप ScheduledPool बना सकते हैं जो एक रननेबल हो और आप जिस भी समय अवधि के लिए दौड़ सकते हैं। उदाहरण के लिए

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new MyRunnable(), 0, 5, TimeUnit.SECONDS); 

हर 5 सेकंड में MyRunnable कक्षा चलाएगा। MyRunnable Runnable लागू करना चाहिए। इसके साथ समस्या यह है कि यह हर बार एक नया धागा बनायेगा (कुशलतापूर्वक) जो वांछनीय हो सकता है या नहीं।

+0

न केवल एक नया धागा बना रहा है, बल्कि 1 – Nick

1

पसंदीदा तरीका:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 

तब की तरह Runnables में पारित:

scheduler.scheduleWithFixedDelay(myRunnable, initDelay, delay, TimeUnit.MILLISECONDS); 

मैं टाइमर का उपयोग नहीं होता। शेड्यूलर उन समस्याओं को संभालने के लिए बनाए जाते हैं जिन्हें टाइमर का कारण बन सकता है। साथ ही, Thread.sleep एक साधारण प्रोग्राम के लिए अच्छा है जिसे आप अवधारणा प्रकार की चीजों के सबूत के लिए जल्दी लिख रहे हैं लेकिन मैं इसे एंटरप्राइज़ दुनिया में उपयोग नहीं करूँगा।