web-dev-qa-db-ja.com

Thread.sleep(x)またはwait()を使用すると例外が発生します

私は自分のJavaプログラムを遅延させようとした、またはスリープさせようとしましたが、エラーが発生します。

Thread.sleep(x)wait()が使えません。同じエラーメッセージが表示されます。

報告されていない例外Java.lang.InterruptedException;キャッチされるか、スローされると宣言されている必要があります。

Thread.sleep()またはwait()メソッドを使用する前に必要な手順はありますか?

339
vincent low

あなたはあなたの前にたくさんの読書をしています。コンパイラエラーから例外処理、スレッド化、スレッド割り込みまで。しかし、これはあなたが望むことをするでしょう:

try {
    Thread.sleep(1000);                 //1000 milliseconds is one second.
} catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
}
574
Konrad Garus

他のユーザーが言ったように、あなたは自分の呼び出しをtry{...} catch{...}ブロックで囲むべきだと言っています。しかしJava 1.5がリリースされて以来、 Thread.sleep(millis) と同じことをするTimeUnitクラスがありますが、もっと便利です。あなたは睡眠操作のための時間単位を選ぶことができます。

try {
    TimeUnit.NANOSECONDS.sleep(100);
    TimeUnit.MICROSECONDS.sleep(100);
    TimeUnit.MILLISECONDS.sleep(100);
    TimeUnit.SECONDS.sleep(100);
    TimeUnit.MINUTES.sleep(100);
    TimeUnit.HOURS.sleep(100);
    TimeUnit.DAYS.sleep(100);
} catch (InterruptedException e) {
    //Handle exception
}

追加のメソッドもあります。 TimeUnit Oracleドキュメント

195

この素晴らしい簡単な投稿を見てください これを正しく行う方法について。

基本的に: InterruptedException をキャッチします。このキャッチブロックを追加する必要があることを忘れないでください。投稿はこれをもう少し説明します。

29
Abel

例外を処理するには、次のコーディング構造を使用してください。

try {
  Thread.sleep(1000);
} catch (InterruptedException ie) {
    //Handle exception
}
13
Jatin

Thread.sleepをtry catchブロックに入れる

try {
    //thread to sleep for the specified number of milliseconds
    Thread.sleep(100);
} catch ( Java.lang.InterruptedException ie) {
    System.out.println(ie);
}
8
JoseK

Android を使用する場合(私がJavaを使用する唯一の時期)、スレッドをスリープ状態にする代わりにハンドラーを使用することをお勧めします。

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, "I've waited for two hole seconds to show this!");

        }
    }, 2000);

参照: http://developer.Android.com/reference/Android/os/Handler.html

7
Sindri Þór

Javaプログラムに遅延を追加するための私の方法。

public void pause1(long sleeptime) {
    try {
        Thread.sleep(sleeptime);
    } catch (InterruptedException ex) {
        //ToCatchOrNot
    }
}

public void pause2(long sleeptime) {
    Object obj = new Object();
    if (sleeptime > 0) {
        synchronized (obj) {
            try {
                obj.wait(sleeptime);
            } catch (InterruptedException ex) {
                //ToCatchOrNot
            }
        }
    }
}
public void pause3(long sleeptime) {
    expectedtime = System.currentTimeMillis() + sleeptime;
    while (System.currentTimeMillis() < expectedtime) {
        //Empty Loop   
    }
}

これは順次遅延のためですが、ループ遅延のために Java Delay/Wait を参照して下さい。

3
D.R.Bendanillo
public static void main(String[] args) throws InterruptedException {
  //type code


  short z=1000;
  Thread.sleep(z);/*will provide 1 second delay. alter data type of z or value of z for longer delays required */

  //type code
}

例えば:-

class TypeCasting {

  public static void main(String[] args) throws InterruptedException {
    short f = 1;
    int a = 123687889;
    short b = 2;
    long c = 4567;
    long d=45;
    short z=1000;
    System.out.println("Value of a,b and c are\n" + a + "\n" + b + "\n" + c + "respectively");
    c = a;
    b = (short) c;
    System.out.println("Typecasting...........");
    Thread.sleep(z);
    System.out.println("Value of B after Typecasting" + b);
    System.out.println("Value of A is" + a);


  }
}
3
user3798741

これを試して:

try{

    Thread.sleep(100);
}catch(Exception e)
{
   System.out.println("Exception caught");
}
3
SlickJava

Java.util.concurrent.TimeUnitを使用してください。

TimeUnit.SECONDS.sleep(1);

1秒間スリープまたは

TimeUnit.MINUTES.sleep(1);

ちょっと寝てください。

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

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

毎秒または1秒遅れでタスクを実行するために、私は 強く [ScheduledExecutorService] [1]と[scheduleAtFixedRate] [2]か[scheduleWithFixedDelay] [3]をお勧めします。

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");
}
0
Gavriel Cohen

Thread.sleep()は初心者には簡単で、単体テストや概念実証に適しているかもしれません。

しかし、 しないでください プロダクションコードにはsleep()を使用してください。結局sleep()はあなたをひどく噛むかもしれません。

マルチスレッド/マルチコアJavaアプリケーションが「スレッド待機」の概念を使用するためのベストプラクティス。 Waitは、スレッドが保持しているすべてのロックとモニタを解放します。これにより、他のスレッドはそれらのモニタを取得し、スレッドが平和的にスリープしている間に続行することができます。

以下のコードはその手法を示しています。

import Java.util.concurrent.TimeUnit;
public class DelaySample {
    public static void main(String[] args) {
       DelayUtil d = new DelayUtil();
       System.out.println("started:"+ new Date());
       d.delay(500);
       System.out.println("half second after:"+ new Date());
       d.delay(1, TimeUnit.MINUTES); 
       System.out.println("1 minute after:"+ new Date());
    }
}

DelayUtilの実装:

import Java.util.concurrent.TimeUnit;
import Java.util.concurrent.locks.Condition;
import Java.util.concurrent.locks.ReentrantLock;

public class DelayUtil {
    /** 
    *  Delays the current thread execution. 
    *  The thread loses ownership of any monitors. 
    *  Quits immediately if the thread is interrupted
    *  
    * @param durationInMillis the time duration in milliseconds
    */
   public void delay(final long durationInMillis) {
      delay(durationInMillis, TimeUnit.MILLISECONDS);
   }

   /** 
    * @param duration the time duration in the given {@code sourceUnit}
    * @param unit
    */
    public void delay(final long duration, final TimeUnit unit) {
        long currentTime = System.currentTimeMillis();
        long deadline = currentTime+unit.toMillis(duration);
        ReentrantLock lock = new ReentrantLock();
        Condition waitCondition = lock.newCondition();

        while ((deadline-currentTime)>0) {
            try {
                lock.lockInterruptibly();    
                waitCondition.await(deadline-currentTime, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            } finally {
                lock.unlock();
            }
            currentTime = System.currentTimeMillis();
        }
    }
}
0
Valchkou

もっと簡単な方法は、System.currentTimeMillis()を使用することです。これは、UTC 1970年1月1日の午前0時からのミリ秒数を返します。たとえば、5秒待つとします。

public static void main(String[] args) {
    //some code
    long original = System.currentTimeMillis();
    while (true) {
        if (System.currentTimeMillis - original >= 5000) {
            break;
        }
    }
    //more code after waiting
}

こうすれば、スレッドや例外を気にする必要がなくなります。お役に立てれば!

0
Sam