Java에서 지연을 어떻게 방지합니까?


344

Java에서 무언가를 시도하고 있으며 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++;
}

스텝 시퀀서를 구축하고 Java를 처음 사용합니다. 어떤 제안?


19
사용하십시오 Thread.Sleep().
Tiny


2
기다리는 목적은 무엇입니까? 특정 이벤트가 발생하기를 기다리고 있습니까? sleep () 메소드의 기능 이해
artdanil

@Tiny, 안전하지 않습니다.
Yousha Aleayoub

12
실제로 Thread.sleep(<milisecondsToSleep>)입니다. 는 s대문자해서는 안됩니다.
Benjamin

답변:


678

일시 중지하려면 다음을 사용하십시오 java.util.concurrent.TimeUnit.

TimeUnit.SECONDS.sleep(1);

1 초 동안 자거나

TimeUnit.MINUTES.sleep(1);

잠을 자다.

이것이 루프이기 때문에 이것은 고유 한 문제인 드리프트를 나타냅니다. 코드를 실행 한 다음 잠들 때마다 매 초마다 조금씩 표류하게됩니다. 이것이 문제라면를 사용하지 마십시오 sleep.

또한 sleep제어와 관련하여 매우 유연하지 않습니다.

매초마다 또는 1 초 지연으로 작업을 실행하려면 a 및 또는 중 하나를 적극 권장합니다 .ScheduledExecutorServicescheduleAtFixedRatescheduleWithFixedDelay

예를 들어, myTask매초마다 메소드를 실행하려면 (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");
}

그리고 자바 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이 Java 8 예제를 실행할 수 없었습니다. App ::이란 무엇입니까? myTask ()를 실행 가능한 람다로 변경하면 작동합니다. Runnable myTask = ()-> {...};
comfytoday

2
메소드 참조 @comfytoday 입니다. 문서 부터 시작하는 것이 좋습니다 .
거미 보리스

TimeUnit.SECONDS.wait(1)던지고 IllegalMonitorStateException윈도우 6.3에서 자바 8.1 빌드 31. 대신 Thread.sleep(1000)try / catch없이 사용할 수 있습니다 .
John Meyer

1
Java 8에서는 java.util.concurrent.TimeUnit Unhandled exception: java.lang.InterruptedExecution에서sleep(1)
Shai Alon

1
당신은 묶어야합니다 TimeUnit.SECONDS.sleep(1);함께try catch
샤이 아론

148

사용 Thread.sleep(1000);

1000 프로그램이 일시 정지하는 시간 (밀리 초)입니다.

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

5
InterruptedException을 기록하는 것을 잊지 마십시오. 그렇지 않으면이 스레드가 중단되었음을 알 수 없습니다.
m0skit0

12
Thread.currentThread (). interrupt ();에 대해 궁금합니다. 여기에 있습니다.
Brent212

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코드를 벌크하게 만들어야합니다 InterruptedException. 내부에서 이미 다루는 유틸리티를 제공하는 MgntUtils (나에 의해 작성된)라는 오픈 소스 Java 라이브러리가 있습니다. 따라서 코드에는 한 줄만 포함됩니다.

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

여기 에서 javadoc을 참조 하십시오 . Maven Central 또는 Github 에서 라이브러리에 액세스 할 수 있습니다 . 라이브러리에 대해 설명하는 기사는 여기 에서 찾을 수 있습니다.


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일시 정지 할 밀리 초 수로 바꾸십시오 . 이렇게하면 일시 중지 할 때마다 전체 try-catch 문을 삽입 할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.