Làm cách nào để tạo độ trễ trong Java?


343

Tôi đang cố gắng làm một cái gì đó trong Java và tôi cần một cái gì đó để chờ / trì hoãn trong một vài giây trong một vòng lặp while.

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

Tôi muốn xây dựng một trình sắp xếp bước và tôi chưa quen với Java. Bất kỳ đề xuất?


19
Sử dụng Thread.Sleep().
Tiny

2
Cân nhắc sử dụng Đồng hồ bấm giờ
PeterMmm

2
Mục đích của sự chờ đợi là gì? Bạn đang chờ đợi một sự kiện nào đó xảy ra? Hãy chắc chắn rằng bạn hiểu phương thức ngủ () làm gì
artdanil

@Tiny, nó KHÔNG an toàn.
Yousha Aleayoub

12
Nó thực sự là Thread.sleep(<milisecondsToSleep>). Không snên viết hoa.
Benjamin

Câu trả lời:


677

Nếu bạn muốn tạm dừng thì sử dụng java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Ngủ một giây hoặc

TimeUnit.MINUTES.sleep(1);

Để ngủ một phút.

Vì đây là một vòng lặp, điều này thể hiện một vấn đề cố hữu - trôi dạt. Mỗi khi bạn chạy mã và sau đó ngủ, bạn sẽ trôi đi một chút từ việc chạy, nói, mỗi giây. Nếu đây là một vấn đề thì không nên sử dụngsleep .

Hơn nữa, sleepkhông linh hoạt khi kiểm soát.

Để chạy một nhiệm vụ mỗi giây hoặc ít một giây chậm trễ tôi sẽ mạnh mẽ đề nghị một ScheduledExecutorServicevà một trong hai scheduleAtFixedRatehoặc scheduleWithFixedDelay.

Ví dụ: để chạy phương thức myTaskmỗi giây (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");
}

Và trong Java 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 Tôi không thể lấy ví dụ Java 8 này để chạy. Ứng dụng :: chính xác là gì? Bằng cách thay đổi myTask () thành lambda có thể chạy được, nó hoạt động: Runnable myTask = () -> {...};
comfytoday

2
Đây là tài liệu tham khảo phương pháp @comfytoday - Tôi khuyên bạn nên bắt đầu với tài liệu này .
Boris the Spider

TimeUnit.SECONDS.wait(1)đang ném IllegalMonitorStateExceptionvào Java 8.1 bản dựng 31 trên Windows 6.3. Thay vào đó, tôi có thể sử dụng Thread.sleep(1000)mà không cần thử / bắt.
John Meyer

1
Trong Java 8, trong java.util.concản.TimeUnit bạn nhận được Unhandled exception: java.lang.InterruptedExecutionchosleep(1)
Shai Alon

1
Bạn phải vây quanh TimeUnit.SECONDS.sleep(1);vớitry catch
Shai Alon

148

Sử dụng Thread.sleep(1000);

1000 là số mili giây mà chương trình sẽ tạm dừng.

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

5
Đừng quên đăng nhập Interrupttedception hoặc bạn sẽ không bao giờ biết chủ đề này bị gián đoạn.
m0skit0

12
Tôi tò mò về những gì Thread.cienThread (). Interrupt (); không ở đây
Brent212

1
xem: "Tại sao chúng ta phải làm gián đoạn chủ đề một lần nữa?" tại đây: javaspecialists.eu/archive/Issue056.html
Tristan


4

dùng cái này:

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

sau đó bạn có thể gọi phương thức này bất cứ nơi nào như:

        wait(1000);

3

Sử dụng TimeUnit.SECONDS.sleep(1);hoặc Thread.sleep(1000);là cách chấp nhận để làm điều đó. Trong cả hai trường hợp, bạn phải nắm bắt InterruptedExceptionmã làm cho Bulky của mình. Có một thư viện java mã nguồn mở có tên là MgntUtils (được viết bởi tôi) cung cấp tiện ích đã xử lý InterruptedExceptionbên trong. Vì vậy, mã của bạn sẽ chỉ bao gồm một dòng:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Xem javadoc tại đây . Bạn có thể truy cập thư viện từ Maven Central hoặc từ Github . Bài viết giải thích về thư viện có thể được tìm thấy ở đây


2
Sử dụng catch (InterruptedException e) { /* empty */ }KHÔNG một giải pháp hợp lý ở đây. Ít nhất, bạn nên cung cấp một số thông tin nhật ký. Để biết thêm thông tin về chủ đề này, hãy xem javaspecialists.eu/archive/Issue056.html
Marco13

3

Sử dụng Thread.sleep(100);. Đơn vị thời gian là mili giây

Ví dụ:

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

Tôi biết đây là một bài viết rất cũ nhưng điều này có thể giúp được ai đó: Bạn có thể tạo một phương thức, vì vậy bất cứ khi nào bạn cần tạm dừng, bạn có thể nhập pause(1000)hoặc bất kỳ giá trị mili giây nào khác:

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

Điều này được chèn ngay phía trên public static void main(String[] args), bên trong lớp. Sau đó, để gọi phương thức, nhập pause(ms)nhưng thay thế msbằng số mili giây để tạm dừng. Bằng cách đó, bạn không phải chèn toàn bộ câu lệnh thử bất cứ khi nào bạn muốn tạm dừng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.