Javaで遅延を発生させるにはどうすればよいですか?


343

私は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()ます。
小さな2014年


2
待つ目的は何ですか?特定のイベントが発生するのを待っていますか?sleep()メソッドの機能を理解していることを確認してください
artdanil '08 / 06/08

@Tiny、それは安全ではありません。
Yousha Aleayoub 2017

12
実際Thread.sleep(<milisecondsToSleep>)です。をs大文字にしないでください。
ベンジャミン

回答:


677

一時停止したい場合は、次を使用してjava.util.concurrent.TimeUnitください:

TimeUnit.SECONDS.sleep(1);

1秒間寝るか

TimeUnit.MINUTES.sleep(1);

ちょっと寝る。

これはループであるため、ドリフトという固有の問題があります。コードを実行してからスリープするたびに、たとえば毎秒実行から少しドリフトします。これが問題である場合は、使用しないでくださいsleep

さらに、sleepコントロールに関しては、それほど柔軟ではありません。

毎秒タスクを実行するためか、1秒の遅延で、私は考えを強くお勧めしますScheduledExecutorServiceし、どちらかscheduleAtFixedRateまたはscheduleWithFixedDelay

たとえば、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");
}

そして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このJava 8のサンプルを実行できませんでした。App ::とは正確には何ですか?myTask()を実行可能なラムダに変更することで機能します。Runnable myTask =()-> {...};
快適な

2
これはメソッドリファレンス@comfytoday です。ドキュメントから始めることをお勧めします
ボリス・ザ・スパイダー

TimeUnit.SECONDS.wait(1)IllegalMonitorStateExceptionWindows 6.3でJava 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 2016年

12
Thread.currentThread()。interrupt();について知りたいです。ここで行います。
Brent212

1
参照:「なぜスレッドを再び中断しなければならないのですか?」ここ:javaspecialists.eu/archive/Issue056.html
Tristan


4

これを使って:

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、コードをかさばる原因となるキャッチする必要があります。MgntUtils(私が作成したもの)と呼ばれるオープンソースのJavaライブラリがあり、InterruptedException内部ですでに処理されているユーティリティを提供しています。したがって、コードには1行だけが含まれます。

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.