Javaプログラムを遅らせようとしたり、スリープさせたりしようとしましたが、エラーが発生しました。
Thread.sleep(x)
またはを使用できませんwait()
。同じエラーメッセージが表示されます。
報告されていない例外java.lang.InterruptedException; キャッチするか、スローするように宣言する必要があります。
Thread.sleep()
またはwait()
メソッドを使用する前に必要な手順はありますか?
Javaプログラムを遅らせようとしたり、スリープさせたりしようとしましたが、エラーが発生しました。
Thread.sleep(x)
またはを使用できませんwait()
。同じエラーメッセージが表示されます。
報告されていない例外java.lang.InterruptedException; キャッチするか、スローするように宣言する必要があります。
Thread.sleep()
またはwait()
メソッドを使用する前に必要な手順はありますか?
回答:
あなたはあなたの前にたくさんの読書があります。コンパイラエラーから、例外処理、スレッド化、スレッド割り込みまで。しかし、これはあなたが望むことをします:
try {
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
他のユーザーが言ったように、あなたの呼び出しを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 Documentation
try-catch
例外処理で囲む方法の例については、他の回答を参照してください。
見ていこの優れた簡単なポストに適切にこれを行う方法についてを。
基本的に:をキャッチしInterruptedException
ます。このキャッチブロックを追加する必要があることに注意してください。投稿では、これについてもう少し詳しく説明しています。
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
これを試して:
try{
Thread.sleep(100);
}catch(Exception e)
{
System.out.println("Exception caught");
}
Exception
Javaで捕まえるのは悪い習慣ではないでしょうか?
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の遅延/待機を参照してください。
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);
}
}
待機する簡単な方法は、を使用することです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
}
この方法では、スレッドや例外をいじる必要はありません。お役に立てれば!
使用java.util.concurrent.TimeUnit
:
TimeUnit.SECONDS.sleep(1);
1秒間寝るか
TimeUnit.MINUTES.sleep(1);
少し寝ます。
これはループであるため、ドリフトという固有の問題があります。コードを実行してからスリープするたびに、たとえば毎秒実行から少しドリフトします。これが問題である場合は、使用しないでくださいsleep
。
さらに、sleep
コントロールに関しては、それほど柔軟ではありません。
1秒ごとまたは1秒の遅延でタスクを実行するには、[ ] [1]と[ ] [2]または[ ] [3]のいずれかを強くお勧めします。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");
}
Thread.sleep()
初心者にとっては簡単で、単体テストや概念実証に適している場合があります。
ただし、量産コードには使用しないでくださいsleep()
。最終的にsleep()
はあなたをひどく噛むかもしれません。
マルチスレッド/マルチコアJavaアプリケーションが「スレッド待機」の概念を使用するためのベストプラクティス。待機は、スレッドによって保持されているすべてのロックとモニターを解放します。これにより、他のスレッドがそれらのモニターを取得して、スレッドが平和にスリープしている間に続行できます。
以下のコードはその手法を示しています。
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();
}
}
}
または、スレッドを処理したくない場合は、次の方法を試してください。
public static void pause(int seconds){
Date start = new Date();
Date end = new Date();
while(end.getTime() - start.getTime() < seconds * 1000){
end = new Date();
}
}
呼び出すと開始し、秒数が経過すると終了します。