X 초마다 "hello world"인쇄


127

최근에 많은 수의 루프를 사용하여 인쇄했습니다 Hello World.

int counter = 0;

while(true) {
    //loop for ~5 seconds
    for(int i = 0; i < 2147483647 ; i++) {
        //another loop because it's 2012 and PCs have gotten considerably faster :)
        for(int j = 0; j < 2147483647 ; j++){ ... }
    }
    System.out.println(counter + ". Hello World!");
    counter++;
}

나는 이것이 매우 어리석은 방법이라는 것을 알고 있지만 아직 Java에서 타이머 라이브러리를 사용한 적이 없습니다. 3 초마다 인쇄하도록 위의 내용을 어떻게 수정합니까?


1
아래 답변이 분명히 귀하의 질문에 대답해야하지만, 귀하가 수행하는 방식에 따라 각 컴퓨터마다 다른 간격이 생길 수 있습니다. 컴파일러를 얼마나 빨리 실행할 수 있는지에 따라 다릅니다.
IHazABone

답변:


187

또한 매 초 마다 작업이 실행되도록 예약하는 데 사용할 수있는 클래스 TimerTimerTask클래스를 살펴볼 수도 있습니다 n.

메서드 를 확장 TimerTask하고 재정의 하는 클래스가 필요합니다.이 클래스 public void run()는 해당 클래스의 인스턴스를 timer.schedule()메서드에 전달할 때마다 실행됩니다 .

다음은 Hello World5 초마다 인쇄되는 예입니다 .-

class SayHello extends TimerTask {
    public void run() {
       System.out.println("Hello World!"); 
    }
}

// And From your main() method or any other method
Timer timer = new Timer();
timer.schedule(new SayHello(), 0, 5000);

9
2-param schedule방법은 지정된 지연 후에 한 번만 실행됩니다. 3-PARAM schedule또는 scheduleAtFixedRate사용할 수 있도록해야합니다.
팀 벤더

2
ㅋㅋ 때로는 답변에 대해 투표권을 얻었으며 마지막으로 솔루션 제공을 통해 혼란을 겪은 이후 내 이해력이 향상되었음을 알게됩니다.
팀 벤더

4
@TimBender OP가 실제로이 작업을 수행했는지 궁금합니다.) 어쨌든 이제는 ExecutorService이 작업 에 사용하는 것을 선호 합니다. 그것은 실제로 전통적인 Thread API에 비해 크게 개선되었습니다. 응답 할 때 사용하지 않았습니다.
Rohit Jain

4
Timer timer = new Timer(true);true악마로 설정해야합니다 . 응용 프로그램을 닫은 후에 타이머를 계속 실행하지 않으려면
Tomasz Mularczyk

이것은 결국 타이머를 이해하게하는 데 도움이되었습니다. + 1. 좋은 일을 계속하십시오!
Daniel Tork

197

정기적 인 작업을 수행하려면을 사용하십시오 ScheduledExecutorService. 특히 ScheduledExecutorService.scheduleAtFixedRate

코드:

Runnable helloRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);

10
다른 누군가도 이것을 높이기를 바랍니다. Thread.sleep ()은 OP의 코드에 가장 적합하지만 바퀴의 아마추어 재발 명입니다. 전문 소프트웨어 엔지니어는 TimerTask와 같은 신뢰할 수있는 신뢰할 수있는 API를 사용합니다. 그러나 ScheduledExecutorService가 더 좋습니다. Brian Goetz 등의 Java Concurrency in Practice를 참조하십시오 . 후자의 수업은 거의 10 년 동안 진행되어 왔으며,이 모든 다른 답변이 간과되는 것은 슬픈 일입니다.
Michael Scheper

2
@MichaelScheper, 감사합니다.이 답변이 TimerTask변형을 능가하는 것을 보게되어 기쁩니다 . 흥미롭게도, 나는 받아 들인 대답이 실제로 정확하지 않다는 것을 알았습니다. \ 두 API의 나이는 따로 ScheduledExecutorService더 직관적으로 선언적입니다. 의 사용 TimeUnit매개 변수가 훨씬 더 발생하는 것을 취소하게한다. 와 같은 코드 시대는 지났습니다 5*60*1000 // 5 minutes.
팀 벤더

2
@TimBender 나는 기간 인수에 대해 3이 있음을 알았습니다. 초 또는 밀리 초인지 확인할 수 없습니다. 500 밀리 초마다 (1 초 반마다) 실행하고 싶습니다.
JohnMerlino

2
아 알 겠어. 네 번째 인수로 TimeUnit.MILLISECONDS와 같은 시간을 지정할 수 있습니다.
JohnMerlino

1
@TerryCarter Java8 +에서 당신은 대신 Runnable helloRunnable = () -> { /*code */ };더 아름다운 것을 할 수있다 ;)
Joel


16

타이머로 알아 내면 도움이되기를 바랍니다. 나는에서 타이머를 사용했습니다 java.util.TimerTimerTask같은 패키지에서. 아래를보십시오 :

TimerTask task = new TimerTask() {

    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

Timer timer = new Timer();
timer.schedule(task, new Date(), 3000);

10

Thread.sleep(3000)내부 for 루프를 사용할 수 있습니다 .

참고 :try/catch 블록 이 필요합니다 .


6
public class HelloWorld extends TimerTask{

    public void run() {

        System.out.println("Hello World");
    }
}


public class PrintHelloWorld {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new HelloWorld(), 0, 5000);

        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("InterruptedException Exception" + e.getMessage());
            }
        }
    }
}

무한 루프 생성 광고 스케줄러 작업이 구성되었습니다.


4

가장 쉬운 방법은 기본 스레드를 3000 밀리 초 (3 초) 절전 모드로 설정하는 것입니다.

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
    System.out.println("Hello world!"):
}

스레드가 X 밀리 초 이상 중지됩니다. 스레드는 더 많은 시간을 슬리핑 할 수 있지만 JVM에 달려 있습니다. 스레드가 최소한 밀리 초 동안 휴면 상태를 유지해야합니다. Thread#sleep문서를 살펴보십시오 .

시스템 타이머 및 스케줄러의 정밀도 및 정확성에 따라 현재 실행중인 스레드가 지정된 시간 (밀리 초) 동안 휴면 (일시적으로 실행 중단) 되도록합니다 .


@Luiggi에게 감사합니다. Java는 내가 실행하는 시스템 (CPU)에 관계없이 항상 3000ms인지 확인합니다.
meiryo

@NandkumarTekale 더 자세한 관리?
meiryo

4
@meiryo 스레드를 최소 X 밀리 초 이상 중지합니다. 스레드는 더 많은 시간을 슬리핑 할 수 있지만 JVM에 달려 있습니다. 스레드가 최소한 밀리 초 동안 휴면 상태를 유지해야합니다.
Luiggi Mendoza

4
주의 사항 : 이것이 실시간 시스템이 아닌 경우 수면은 최소 3000ms이지만 더 길어질 수 있습니다. 특히 사람의 생명이 위험한 곳 (의료 기기, 비행기 조종 등)에서 정확히 3000ms의 수면을 원한다면 실시간 운영 체제를 사용해야합니다.
Kinjal Dixit

1
@meiryo : Luiggi 및 kinjal 아주 잘 :) 설명
Nandkumar Tekale을

3

사용 java.util.TimerTimer#schedule(TimerTask,delay,period)방법이 도움이 될 것입니다.

public class RemindTask extends TimerTask {
    public void run() {
      System.out.println(" Hello World!");
    }
    public static void main(String[] args){
       Timer timer = new Timer();
       timer.schedule(new RemindTask(), 3000,3000);
    }
  }

2

이것은 자바에서 스레드를 사용하는 간단한 방법입니다.

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(Exception e) {
        System.out.println("Exception : "+e.getMessage());
    }
    System.out.println("Hello world!");
}

1

그가 말한 것. 원하는대로 예외를 처리 할 수 ​​있지만 Thread.sleep (miliseconds); 가장 좋은 경로입니다.

public static void main(String[] args) throws InterruptedException {

1

Thread Constructor에서 Runnable 인터페이스를 사용하는 또 다른 간단한 방법이 있습니다.

public class Demo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T1 : "+i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++) {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T2 : "+i);
                }
            }
        });

        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T3 : "+i);
                }
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}


-1

작은 응용 프로그램의 경우 Rohit에서 언급 한 것처럼 Timer 및 TimerTask를 사용하는 것이 좋지만 웹 응용 프로그램에서는 Quartz Scheduler 를 사용 하여 작업을 예약하고 이러한 주기적 작업을 수행합니다.

Quartz 스케줄링에 대한 학습서 를 참조하십시오 .


-1
public class TimeDelay{
  public static void main(String args[]) {
    try {
      while (true) {
        System.out.println(new String("Hello world"));
        Thread.sleep(3 * 1000); // every 3 seconds
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.