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 2014年

回答:


187

また見取ることができますTimerし、TimerTaskあなたは、すべて実行するようにタスクをスケジュールするために使用できるクラス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メソッドは、指定された遅延後に1回実行されることに注意してください。3-param scheduleまたはscheduleAtFixedRateを使用する必要があります。
Tim Bender

2
笑 時々私は答えに賛成投票し、解決策を提供することで最後に混乱させて以来、自分の理解が向上していることに気づきます。
Tim Bender

4
@TimBender OPが本当にこれで彼の仕事を成し遂げたかどうか疑問に思っています;)とにかく、今、私はExecutorServiceこれらの仕事に使用したいと思います。これは、従来のスレッドAPIを大幅に改善したものです。回答時に使用しなかっただけです。
Rohit Jain

4
Timer timer = new Timer(true);trueデーモンとして設定する必要があります。アプリケーションを閉じた後もタイマーを実行したい場合を除きます。
Tomasz Mularczyk 2015

これは私にタイマーを理解するのに役立ちました。
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 et al。のJava Concurrency in Practiceを参照してください。後者のクラスは約10年前から存在しています。これらすべての他の回答が見落としているのは悲しいことです。
Michael Scheper 2013

2
@MichaelScheper、ありがとうございますTimerTask。この回答がようやくバリアントを上回ったことを嬉しく思います。興味深いことに、私は受け入れられた答えが実際には正しくないことに気付きましたScheduledExecutorServiceTimeUnitパラメータとしてを使用すると、何が発生しているかがより明確になります。のようなコードの時代は終わりました5*60*1000 // 5 minutes
Tim Bender

2
@TimBender私はあなたが期間の引数に3を持っていることに気づきました。秒単位かミリ秒単位かわかりません。500ミリ秒(0.5秒)ごとに実行したいのですが。
JohnMerlino 2014年

2
ええ、わかりました。4番目の引数では、TimeUnit.MILLISECONDSなどの時間を指定できます。
JohnMerlino 2014年

1
@TerryCarter In Java8 +代わりに行うことができますが、Runnable helloRunnable = () -> { /*code */ };これはさらに美しいです;)
Joel


16

私はタイマーでそれを理解します、それが役に立てば幸いです。私はからタイマーを使用しているjava.util.Timerし、TimerTask同じパッケージから。下記参照:

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)に関係なく、常に3000ミリ秒であることを確認しますか?
メイリオ2012年

@NandkumarTekaleは、さらに詳しく説明しますか?
メイリオ2012年

4
@meiryoスレッドを少なくともXミリ秒停止します。スレッドはより多くの時間スリープしている可能性がありますが、それはJVMの責任です。保証される唯一のものは、スレッドが少なくともそれらのミリ秒の間スリープすることです。
Luiggi Mendoza、

4
警告:これがリアルタイムシステムではない場合、スリープは少なくとも3000ミリ秒ですが、長くなる可能性があります。特に人間の生命が危険にさらされている場所(医療機器、操縦飛行機など)で正確に3000ミリ秒の睡眠が必要な場合は、リアルタイムオペレーティングシステムを使用する必要があります。
Kinjal Dixit 2012年

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

これは、Javaでスレッドを使用する簡単な方法です。

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

スレッドコンストラクターで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を使用するのは問題ありませんが、Webアプリケーションでは、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.