Bagaimana saya membuat penundaan di Jawa?

344

Saya mencoba melakukan sesuatu di Java dan saya perlu sesuatu untuk menunggu / menunda selama beberapa detik dalam satu loop sementara.

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

Saya ingin membangun sequencer langkah dan saya baru di Jawa. Ada saran?

ardb
sumber
19
Gunakan Thread.Sleep().
Tiny
2
Pertimbangkan untuk menggunakan Timer
PeterMmm
2
Apa tujuan menunggu? Apakah Anda menunggu peristiwa tertentu terjadi? Pastikan Anda memahami apa yang dilakukan metode sleep ()
artdanil
@ Kecil, ini TIDAK aman.
Yousha Aleayoub
12
Sebenarnya Thread.sleep(<milisecondsToSleep>). The sseharusnya tidak dikapitalisasi.
Benjamin

Jawaban:

678

Jika Anda ingin berhenti kemudian gunakan java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Tidur selama satu detik atau

TimeUnit.MINUTES.sleep(1);

Tidur sebentar.

Karena ini adalah loop, ini menyajikan masalah bawaan - drift. Setiap kali Anda menjalankan kode dan kemudian tidur, Anda akan terhanyut sedikit dari berlari, katakanlah, setiap detik. Jika ini merupakan masalah maka jangan gunakan sleep.

Lebih jauh, sleeptidak terlalu fleksibel dalam hal kontrol.

Untuk menjalankan tugas setiap detik atau pada penundaan satu detik saya akan sangat merekomendasikan ScheduledExecutorServicedan scheduleAtFixedRateatau atau scheduleWithFixedDelay.

Misalnya, untuk menjalankan metode myTasksetiap detik (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");
}

Dan di Jawa 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");
}
Boris the Spider
sumber
1
@Matthew Moisen Saya tidak bisa menjalankan contoh Java 8 ini. Apa itu App :: sebenarnya? Dengan mengubah myTask () menjadi lambda yang dapat dijalankan, ia berfungsi: Runnable myTask = () -> {...};
comfytoday
2
Ini adalah referensi metode @comfytoday - Saya sarankan memulai dengan dokumentasi .
Boris the Spider
TimeUnit.SECONDS.wait(1)melempar IllegalMonitorStateExceptiondi Java 8.1 build 31 di Windows 6.3. Sebagai gantinya, saya dapat menggunakan Thread.sleep(1000)tanpa mencoba / menangkap.
John Meyer
1
Di Java 8, di java.util.concurrent.TimeUnit Anda dapatkan Unhandled exception: java.lang.InterruptedExecutionuntuksleep(1)
Shai Alon
1
Anda harus mengelilingi TimeUnit.SECONDS.sleep(1);dengantry catch
Shai Alon
148

Gunakan Thread.sleep(1000);

1000 adalah jumlah milidetik yang akan dijeda oleh program.

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}
Anju Aravind
sumber
5
Jangan lupa untuk login InterruptedException atau Anda tidak akan pernah tahu utas ini terputus.
m0skit0
12
Saya ingin tahu apa yang Thread.currentThread (). Interrupt (); lakukan di sini.
Brent212
1
lihat: "Mengapa kita harus menghentikan utas lagi?" di sini: javaspecialists.eu/archive/Issue056.html
Tristan
5

Gunakan ini:

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

maka Anda dapat memanggil metode ini di mana saja seperti:

        wait(1000);
Hecanet
sumber
3

Menggunakan TimeUnit.SECONDS.sleep(1);atau Thread.sleep(1000);Apakah cara yang dapat diterima untuk melakukannya. Dalam kedua kasus Anda harus menangkap InterruptedExceptionyang membuat kode Anda Bulky.Ada perpustakaan java Open Source disebut MgntUtils (ditulis oleh saya) yang menyediakan utilitas yang sudah berurusan dengan InterruptedExceptiondi dalam. Jadi kode Anda hanya akan mencakup satu baris:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Lihat javadoc di sini . Anda dapat mengakses perpustakaan dari Maven Central atau dari Github . Artikel yang menjelaskan tentang perpustakaan dapat ditemukan di sini

Michael Gantman
sumber
2
Menggunakan catch (InterruptedException e) { /* empty */ }adalah TIDAK solusi yang masuk akal di sini. Paling tidak, Anda harus memberikan beberapa informasi log. Untuk informasi lebih lanjut tentang subjek ini, lihat javaspecialists.eu/archive/Issue056.html
Marco13
3

Gunakan Thread.sleep(100);. Satuan waktu adalah milidetik

Sebagai contoh:

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]);
        }
    }
}
Bachan Joseph
sumber
1

Saya tahu ini adalah posting yang sangat lama tetapi ini dapat membantu seseorang: Anda dapat membuat metode, jadi kapan pun Anda perlu menjeda, Anda dapat mengetik pause(1000)atau nilai milidetik lainnya:

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

Ini dimasukkan tepat di atas public static void main(String[] args), di dalam kelas. Kemudian, untuk memanggil metode, ketik pause(ms)tetapi ganti msdengan jumlah milidetik untuk berhenti. Dengan begitu, Anda tidak perlu memasukkan seluruh pernyataan try-catch kapan pun Anda ingin berhenti.

dominic03
sumber