Java'da nasıl gecikme yapabilirim?


344

Java bir şey yapmaya çalışıyorum ve bir süre döngü içinde bir saniye saniye beklemek / gecikmek için bir şey gerekir.

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++;
}

Bir adım sıralayıcısı oluşturmak istiyorum ve Java için yeniyim. Herhangi bir öneri?


19
Kullanın Thread.Sleep().
Küçük


2
Beklemenin amacı nedir? Belirli bir olayın gerçekleşmesini mi bekliyorsunuz? Sleep () yönteminin ne yaptığını anladığınızdan emin olun
artdanil

@Tiny, güvenli değil.
Yousha Aleayoub

12
Aslında öyle Thread.sleep(<milisecondsToSleep>). Büyük sharf kullanılmamalıdır.
Benjamin

Yanıtlar:


678

Duraklatmak istiyorsanız şunu kullanın java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Bir saniye uyumak veya

TimeUnit.MINUTES.sleep(1);

Bir dakika uyumak.

Bu bir döngü olduğu için, doğasında var olan bir sorun - sürüklenme ortaya çıkar. Her kod çalıştırdığınızda ve sonra uyuduğunuzda, her saniye biraz koşmaktan sürükleneceksiniz. Bu bir sorunsa kullanmayın sleep.

Ayrıca, sleepkontrol söz konusu olduğunda çok esnek değildir.

Bir görevi her saniye veya bir saniyelik bir gecikmeyle yürütmek için bir veya ikisini şiddetle öneririm .ScheduledExecutorServicescheduleAtFixedRatescheduleWithFixedDelay

Örneğin, yöntemi myTasksaniyede bir çalıştırmak için (Java 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");
}

Java 7'de:

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 Bu Java 8 örneğini çalıştıramadım. Uygulama :: tam olarak nedir? MyTask () öğesini çalıştırılabilir bir lambda olarak değiştirerek çalışır: Runnable myTask = () -> {...};
comfytoday

2
Bu @comfytoday yöntem referansıdır - dokümantasyonla başlamanızı öneririm .
Örümcek Boris

TimeUnit.SECONDS.wait(1)IllegalMonitorStateExceptionWindows 6.3 üzerinde Java 8.1 build 31'i atıyor . Bunun yerine, Thread.sleep(1000)bir try / catch olmadan kullanabiliyorum .
John Meyer

1
Java 8'de, java.util.concurrent.TimeUnit girdin Unhandled exception: java.lang.InterruptedExecutioniçinsleep(1)
Shai Alon

1
Sen çevreleyen gerekir TimeUnit.SECONDS.sleep(1);iletry catch
Shai Alon

148

Kullanın Thread.sleep(1000);

1000 , programın duraklatacağı milisaniye sayısıdır.

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

5
InterruptedException oturum açmayı unutmayın, yoksa bu iş parçacığının kesintiye uğradığını asla bilemezsiniz.
m0skit0

12
Thread.currentThread (). İnterrupt (); burada.
Brent212

1
bakınız: "Neden iş parçacığını tekrar kesmek zorundayız?" burada: javaspecialists.eu/archive/Issue056.html
Tristan


5

bunu kullan:

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

bu yöntemi şöyle bir yerde çağırabilirsiniz:

        wait(1000);

3

Bunu kullanmak TimeUnit.SECONDS.sleep(1);veya Thread.sleep(1000);kabul edilebilir bir yoludur. Her iki durumda InterruptedExceptionda kodunuzu Bulky yapan yakalamak zorundasınız. MgntUtils (benim tarafımdan yazılmış) adlı bir Açık Kaynak java kütüphanesi zaten InterruptedExceptioniçinde yardımcı programı sağlar . Yani kodunuz sadece bir satır içerir:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Buradaki javadoc'a bakın . Kütüphaneye Maven Central'dan veya Github'dan erişebilirsiniz . Kütüphane hakkında açıklayıcı makaleyi burada bulabilirsiniz


2
Kullanımı catch (InterruptedException e) { /* empty */ }ise DEĞİL burada mantıklı bir çözüm. En azından, bazı günlük bilgileri sağlamanız gerekir. Konu hakkında daha fazla bilgi için bkz. Javaspecialists.eu/archive/Issue056.html
Marco13

3

Kullanın Thread.sleep(100);. Zaman birimi milisaniyedir

Örneğin:

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

Bu çok eski bir yazı olduğunu biliyorum ama bu birine yardımcı olabilir: Bir yöntem oluşturabilirsiniz, böylece her duraklatma gerektiğinde yazabilirsiniz pause(1000)veya başka bir milisaniye değeri:

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

Bu, public static void main(String[] args)sınıfın hemen üstüne eklenir . Ardından, yöntemi çağırmak için yazın pause(ms)ancak msduraklatılacak milisaniye sayısı ile değiştirin . Bu şekilde, duraklatmak istediğinizde tüm try-catch deyimini eklemeniz gerekmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.