मैं जावा में देरी कैसे करूं?


344

मैं जावा में कुछ करने की कोशिश कर रहा हूं और मुझे कुछ समय के लिए इंतजार करने / विलंब करने की आवश्यकता है।

while (true) {
    if (i == 3) {
        i = 0;
    }

    ceva[i].setSelected(true);

    // I need to wait here

    ceva[i].setSelected(false);

    // I need to wait here

    i++;
}

मैं एक स्टेप सीक्वेंसर बनाना चाहता हूं और मैं जावा के लिए नया हूं। कोई सुझाव?


19
का उपयोग करें Thread.Sleep()
टिनी


2
इंतजार करने का मकसद क्या है? क्या आप किसी निश्चित घटना के होने की प्रतीक्षा कर रहे हैं? सुनिश्चित करें कि आप समझते हैं कि नींद क्या है () विधि क्या है
artdanil

@ छोटे, यह सुरक्षित नहीं है।
यौषा अलाय्यूब

12
यह वास्तव में है Thread.sleep(<milisecondsToSleep>)sपूंजीकृत नहीं होना चाहिए।
बेंजामिन

जवाबों:


678

यदि आप रोकना चाहते हैं तो उपयोग करें java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

एक सेकंड के लिए सोने के लिए या

TimeUnit.MINUTES.sleep(1);

एक मिनट के लिए सोने के लिए।

जैसा कि यह एक लूप है, यह एक अंतर्निहित समस्या प्रस्तुत करता है - बहाव। हर बार जब आप कोड चलाते हैं और फिर सोते हैं तो आप दौड़ने से थोड़ा हटकर कहेंगे, हर सेकंड। यदि यह एक समस्या है तो उपयोग न करें sleep

इसके अलावा, sleepबहुत लचीला नहीं है जब यह नियंत्रण में आता है।

किसी कार्य को हर सेकंड या एक सेकंड की देरी से चलाने के लिए, मैं दृढ़ता से या ScheduledExecutorServiceतो सिफारिश करूँगा ।scheduleAtFixedRatescheduleWithFixedDelay

उदाहरण के लिए, विधि को myTaskहर सेकंड (जावा 8) चलाने के लिए :

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

और जावा 7 में:

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            myTask();
        }
    }, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

1
@Matthew Moisen मैं चलाने के लिए इस जावा 8 उदाहरण नहीं मिल सकता है। ऐप क्या है :: बिलकुल? MyTask () को रननेबल लैम्ब्डा में बदलकर यह काम करता है: रननेबल myTask = () -> {...};
comfytoday

2
यह एक विधि संदर्भ @comfytoday है - मैं सुझाव देता हूं कि दस्तावेज के साथ शुरू करें
बोरिस स्पाइडर

TimeUnit.SECONDS.wait(1)IllegalMonitorStateExceptionविंडोज 8.1 पर जावा 8.1 बिल्ड 31 में फेंक रहा है। इसके बजाय, मैं Thread.sleep(1000)एक कोशिश / पकड़ के बिना उपयोग करने में सक्षम हूं ।
जॉन मेयेर

1
जावा 8 में, java.util.concurrent.TimeUnit में आपको मिल Unhandled exception: java.lang.InterruptedExecutionके लिएsleep(1)
शाई एलन

1
आपको TimeUnit.SECONDS.sleep(1);साथ में घेरना होगाtry catch
Shai Alon

148

का उपयोग करें Thread.sleep(1000);

1000 मिलीसेकंड की संख्या है जो कार्यक्रम को रोक देगा।

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}

5
InterruptedException को लॉग इन करना न भूलें या आप कभी नहीं जान पाएंगे कि यह धागा बाधित हो गया है।
m0skit0

12
मैं क्या कर रहा हूँ के रूप में उत्सुक हूँ। Thread.currentThread ()। व्यवधान (); यहाँ करता है।
ब्रेंट 212

1
देखें: "हमें फिर से थ्रेड को क्यों बाधित करना पड़ता है?" यहाँ: javaspecialists.eu/archive/Issue056.html
Tristan


5

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

public static void wait(int ms){
        try
        {
            Thread.sleep(ms);
        }
        catch(InterruptedException ex)
        {
            Thread.currentThread().interrupt();
        }
    }

तो आप इस विधि को कहीं भी कॉल कर सकते हैं:

        wait(1000);

3

इसका उपयोग करना TimeUnit.SECONDS.sleep(1);या Thread.sleep(1000);स्वीकार्य तरीका है। दोनों मामलों में आपको पकड़ना पड़ता है InterruptedExceptionजो आपके कोड को Bulky.There बनाता है। एक ओपन सोर्स जावा लाइब्रेरी है जिसे MgntUtils कहा जाता है (मेरे द्वारा लिखित) जो उपयोगिता प्रदान करता है जो पहले से ही InterruptedExceptionअंदर से संबंधित है। तो आपके कोड में सिर्फ एक पंक्ति शामिल होगी:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

यहां जावदोक देखें । आप मावेन सेंट्रल से या जीथूब से पुस्तकालय का उपयोग कर सकते हैं । पुस्तकालय के बारे में समझाने वाला लेख मिल सकता है यहां है


2
का उपयोग करना catch (InterruptedException e) { /* empty */ }है नहीं एक समझदार समाधान यहाँ। बहुत कम से कम, आपको कुछ लॉग जानकारी प्रदान करनी चाहिए। विषय के बारे में अधिक जानकारी के लिए, javaspecialists.eu/archive/Issue056.html
Marco13

3

उपयोग Thread.sleep(100); । समय की इकाई मिलीसेकंड है

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

public class SleepMessages {
    public static void main(String args[])
        throws InterruptedException {
        String importantInfo[] = {
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        };

        for (int i = 0;
             i < importantInfo.length;
             i++) {
            //Pause for 4 seconds
            Thread.sleep(4000);
            //Print a message
            System.out.println(importantInfo[i]);
        }
    }
}

1

मुझे पता है कि यह एक बहुत पुरानी पोस्ट है, लेकिन इससे किसी को मदद मिल सकती है: आप एक विधि बना सकते हैं, इसलिए जब भी आपको रुकने की आवश्यकता हो तो आप pause(1000)या कोई अन्य मिलीसेकंड मान टाइप कर सकते हैं :

public static void pause(int ms) {
    try {
        Thread.sleep(ms);
    } catch (InterruptedException e) {
        System.err.format("IOException: %s%n", e);
    }
}

यह public static void main(String[] args)कक्षा के ठीक ऊपर , अंदर डाला जाता है । फिर, विधि पर कॉल करने के लिए, टाइप करें, pause(ms)लेकिन msमिलीसेकेंड की संख्या को रोकने के लिए बदलें । इस तरह, आपको जब भी आप विराम देना चाहते हैं, तो आपको संपूर्ण ट्राइ-कैच स्टेटमेंट सम्मिलित नहीं करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.