web-dev-qa-db-ja.com

Javaをどのように遅延させるのですか?

私は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が初めてです。助言がありますか?

261
ardb

一時停止したい場合はJava.util.concurrent.TimeUnitを使用してください。

TimeUnit.SECONDS.sleep(1);

1秒間寝る

TimeUnit.MINUTES.sleep(1);

ちょっと寝る。

これはループなので、これは本質的な問題 - ドリフト - を提示します。コードを実行してからスリープするたびに、実行から少しずつ漂っていくでしょう。これが問題であればsleepを使わないでください。

さらに、sleepは制御に関してはあまり柔軟ではありません。

毎秒または1秒の遅れでタスクを実行するには、 strong 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");
}
522

Thread.sleep(1000)を使用してください。

1000は、プログラムが一時停止するミリ秒数です。

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

Thread.sleep()呼び出しを使う必要があります。

ここでより多くの情報: http://docs.Oracle.com/javase/tutorial/essential/concurrency/sleep.html

6
Ruslan

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]);
        }
    }
}
3
Bachan Joseph

私はこれが非常に古い投稿であることを知っていますが、これは誰かを助けるかもしれません:メソッドを作成できますので、一時停止する必要があるときはいつでも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ステートメント全体を挿入する必要がなくなります。

1
dominic03
`
while (true) {
    if (i == 3) {
        i = 0;
    }

    ceva[i].setSelected(true);

     try{Thread.sleep(time_in_milliseconds);}catch(InterruptedException ie){}

    ceva[i].setSelected(false);

     try{Thread.sleep(1000);}catch(InterruptedException ie){}

    i++;
}

1秒= 1000ミリ秒

0
purav desai

これを使って:

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

次に、次のようにこのメソッドを呼び出すことができます。

        wait(1000);
0
Hecanet

TimeUnit.SECONDS.sleep(1);またはThread.sleep(1000);を使用するのは許容できる方法です。どちらの場合も、コードをBulkyにするInterruptedExceptionname__をキャッチする必要があります。MgntUtilsと呼ばれるオープンソースのJavaライブラリがあります。これは、内部ですでにInterruptedExceptionname__を処理するユーティリティを提供します。そのため、コードには1行だけが含まれます。

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Javadoc here を参照してください。 Maven Central または Github からライブラリにアクセスできます。図書館について説明している記事が見つかりました ここ

0
Michael Gantman