जावा में टाइमर कैसे सेट करें?


151

एक टाइमर सेट करने के लिए, 2 मिनट के लिए, डेटाबेस से कनेक्ट करने का प्रयास करने के लिए तब अपवाद फेंक दें यदि कनेक्शन में कोई समस्या है?


1
Coul ओपी स्पष्ट करता है कि क्या वे कम से कम 2 मिनट के लिए कार्रवाई का सरल प्रयास करना चाहते हैं, या यदि अपवाद को अब दो मिनट बाद फेंक दिया जाना चाहिए, भले ही वर्तमान में कनेक्ट करने का प्रयास चल रहा हो
thecoshman

जवाबों:


280

तो जवाब का पहला हिस्सा यह है कि कैसे करें कि विषय क्या पूछता है क्योंकि मैंने शुरू में इसकी व्याख्या की थी और कुछ लोगों को यह मददगार लग रहा था। प्रश्न स्पष्ट होने के बाद से था और मैंने इसका जवाब देने के लिए उत्तर दिया है।

टाइमर सेट करना

पहले आपको एक टाइमर बनाने की आवश्यकता है (मैं java.utilयहां संस्करण का उपयोग कर रहा हूं ):

import java.util.Timer;

..

Timer timer = new Timer();

एक बार कार्य करने के लिए आप क्या करेंगे:

timer.schedule(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000);
// Since Java-8
timer.schedule(() -> /* your database code here */, 2*60*1000);

आपके द्वारा किए जाने वाले अवधि के बाद कार्य को दोहराने के लिए:

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000, 2*60*1000);

// Since Java-8
timer.scheduleAtFixedRate(() -> /* your database code here */, 2*60*1000, 2*60*1000);

किसी कार्य को समय-समय पर करना

विशेष रूप से वह करने के लिए जो स्पष्ट प्रश्न पूछता है, जो किसी दिए गए समय के लिए कार्य करने का प्रयास कर रहा है, आप निम्नलिखित कार्य कर सकते हैं:

ExecutorService service = Executors.newSingleThreadExecutor();

try {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            // Database task
        }
    };

    Future<?> f = service.submit(r);

    f.get(2, TimeUnit.MINUTES);     // attempt the task for two minutes
}
catch (final InterruptedException e) {
    // The thread was interrupted during sleep, wait or join
}
catch (final TimeoutException e) {
    // Took too long!
}
catch (final ExecutionException e) {
    // An exception from within the Runnable task
}
finally {
    service.shutdown();
}

यह सामान्य रूप से अपवादों के साथ निष्पादित करेगा यदि कार्य 2 मिनट के भीतर पूरा हो जाता है। यदि यह उससे अधिक समय तक चलता है, तो टाइमआउट अपवाद को फेंक दिया जाएगा।

एक मुद्दा यह है कि यद्यपि आपको दो मिनट के बाद टाइमआउट अपवाद मिल जाएगा , कार्य वास्तव में चलना जारी रहेगा , हालांकि संभवतः एक डेटाबेस या नेटवर्क कनेक्शन अंततः समय समाप्त हो जाएगा और थ्रेड में एक अपवाद फेंक देगा। लेकिन ध्यान रहे कि ऐसा होने तक संसाधनों की खपत हो सकती है।


ओह, मुझे लगता है कि आपको मेरी समस्या गलत लगी, मुझे बार-बार डेटाबेस से जुड़ने की कोशिश करनी पड़ रही है 2 मिनट तक हर समय
अंकिता

मुझे खेद है लेकिन मेरी आवश्यकता यह है कि मैं डेटाबेस से जुड़ने के लिए 2 मिनट का समय देना चाहता हूं और फिर यह बस कुछ त्रुटि संदेश फेंक देगा। यह ऐसा है जैसे मैं डेटाबेस से जुड़ने के लिए समय सीमा निर्धारित करना चाहता हूं
अंकिता

7
READERS BEWARE: यह उत्तर स्पष्ट रूप से गलत है। यह 2 मिनट प्रतीक्षा करने के लिए एक टाइमर सेट करता है, और फिर उस 2 मिनट की देरी के बाद एक DB क्वेरी चलाता है, और फिर इसे हर 2 मिनट में फिर से चलाता है। डीबी क्वेरी को तुरंत चलाने के लिए यह क्या नहीं करता है, और फिर 2 मिनट के बाद असफल हो जाता है जो मुझे लगता है कि प्रश्न के लिए कहा गया है (जैसा कि टिप्पणी में स्पष्ट किया गया है)।
AgilePro

2
@AgilePro यह सच था। मैंने सवाल का जवाब नहीं दिया क्योंकि यह अंततः कहा गया था और मैंने अब इसे संबोधित करने के लिए अपडेट किया है।
andrewmu

1
@ErnestasGruodis कोर APIs निर्माणकर्ता को सार्वजनिक रूप से सूचीबद्ध करते हैं: docs.oracle.com/javase/7/docs/api/java/util/Timer.html#Timer () आपके क्लासपाथ में एक अलग टाइमर वर्ग हो सकता है - जावा आज़माएं। वर्ग के रूप में उपयोग करें।
andrewmu

25

इसे इस्तेमाल करो

long startTime = System.currentTimeMillis();
long elapsedTime = 0L.

while (elapsedTime < 2*60*1000) {
    //perform db poll/check
    elapsedTime = (new Date()).getTime() - startTime;
}

//Throw your exception

1
हम्म ... यह तकनीकी रूप से काम करेगा, सिवाय इसके कि किनारे के मामलों को कवर नहीं करता है, जहां आप समय निकालते हैं जैसा कि आप एक डीबी सर्वेक्षण कर रहे हैं, जो ओपी द्वारा आवश्यक हो सकता है
thecoshman

1
यह एकमात्र सही उत्तर है। यह एक ही धागे पर चलेगा, और बहाव के बिना अंत समय की गणना करेगा। एक TimerTask का उपयोग करना इस मामले में बिल्कुल गलत बात है। मुझे आश्चर्य है कि StackOverflow पर कितने उदाहरण इस तरह की गलत हेडलाइंस का सुझाव देते हैं।
अगिलेप्रो

1
@thecoshman - टाइमर कार्यान्वयन प्रगति पर होने के बाद DB ऑपरेशन को बाधित नहीं करता है, न ही ऐसा करता है। किसी भी स्थिति में, आप केवल उस समय को नियंत्रित कर सकते हैं जब आप DB ऑपरेशन शुरू करते हैं। एक आम ग़लतफ़हमी है कि आपको समय की चीजों के लिए "टाइमर" की आवश्यकता है, लेकिन आप नहीं करते हैं। आपको केवल कुछ करने की आवश्यकता है, और वर्तमान समय का उपयोग करके सुनिश्चित करें कि आप इसे बहुत लंबा नहीं करते हैं।
एजिलेप्रो

मान लीजिए कि आपको कनेक्शन वापस करना है या दो मिनट के बाद फेंक देना है, यह काम नहीं करेगा। यदि आप कनेक्ट करने की कोशिश कर रहे हैं तो दो मिनट के बाद भी यह कनेक्ट करने में विफल रहा है। ऐसी स्थिति में जहां कनेक्शन की जांच में दो सप्ताह लगते हैं, अपवाद को फेंकने में यह लंबा समय लेगा।
धर्मशाला

14
यह वास्तव में बहुत खराब कोडिंग शैली है, जबकि लूप लगातार चलता रहता है और सामान की जांच करता है ... सीपीयू के लिए बुरा और बैटरी जीवन समय के लिए खराब।
अनंत

11

ठीक है, मुझे लगता है कि मैं अब आपकी समस्या को समझता हूं। आप कुछ करने की कोशिश करने के लिए फ्यूचर का उपयोग कर सकते हैं और फिर कुछ नहीं होने पर थोड़े समय के बाद टाइमआउट कर सकते हैं।

उदाहरण के लिए:

FutureTask<Void> task = new FutureTask<Void>(new Callable<Void>() {
  @Override
  public Void call() throws Exception {
    // Do DB stuff
    return null;
  }
});

Executor executor = Executors.newSingleThreadScheduledExecutor();
executor.execute(task);

try {
  task.get(5, TimeUnit.SECONDS);
}
catch(Exception ex) {
  // Handle your exception
}

अपवाद फेंक दिया गया है, लेकिन कार्यक्रम समाप्त नहीं हो रहा है। कृपया इसके माध्यम से मेरी मदद करें।
अंकिता

2
आप Executor के बजाय ExecutorService क्लास का उपयोग कर सकते हैं। यह निष्पादक को रोकने के लिए शटडाउन () विधि है।
Rites

1
निष्पादनकर्ता ऐसे अपवादों को निगल लेंगे जिन्हें आप विशेष रूप से अपने Callable / Runnable में हैंडल नहीं करते हैं। यदि आपका Runnable / Callable स्वयं अपवाद को नहीं पकड़ता है और उसे संभालता है और यह आपके द्वारा प्रदान किया गया है, तो आपको शेड्यूल किया गया है, तो आपको ScheduledExecutorService को सब्स्क्राइब करना होगा और afterExecute को ओवरराइड करना होगा (सुपर .AfterExecute ()) को कॉल करना सुनिश्चित करें। AfterExecute का दूसरा तर्क Runnable / Callable
adam

3
    new java.util.Timer().schedule(new TimerTask(){
        @Override
        public void run() {
            System.out.println("Executed...");
           //your code here 
           //1000*5=5000 mlsec. i.e. 5 seconds. u can change accordngly 
        }
    },1000*5,1000*5); 

कोड के ऊपर बस कॉपी पेस्ट यह ठीक काम करेगा। मैंने दो बार 'समय' दिया है पहला पहली बार इस कोड को निष्पादित करने के लिए है और दूसरा अंतराल समय के लिए है।
महादेव माने

टाइमर के लिए प्रलेखन इसके बजाय एक्ज़ीक्यूटर फ्रेमवर्क का उपयोग करने की सलाह देता है। docs.oracle.com/javase/10/docs/api/java/util/Timer.html
करण खन्ना

1

[Android] अगर कोई जावा का उपयोग करके Android पर टाइमर लागू करना चाहता है ।

ऑपरेशन करने के लिए आपको यूआई थ्रेड का उपयोग करने की आवश्यकता है।

Timer timer = new Timer();
timer.schedule(new TimerTask() {
           @Override
            public void run() {
                ActivityName.this.runOnUiThread(new Runnable(){
                    @Override
                      public void run() {
                       // do something
                      }        
                });
            }
        }, 2000));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.