比較表
比較基準 | 睡眠 | 待つ |
---|---|---|
基本 | スリープメソッドは、中断されるまでオブジェクトのロックを解除しません。 | waitメソッドは、notifyまたはnotifyAllメソッドが呼び出されるまで他のオブジェクトを実行できるように、オブジェクトに対するロックを解除します。 |
クラス | sleepメソッドはThreadクラスに定義されています。 | waitメソッドはObjectクラスで定義されています。 |
同期しています | スリープメソッドは同期コンテキスト内で呼び出す必要はありません。 | 待機メソッドは同期コンテキスト内で呼び出す必要があります。 |
完了 | スレッドがそれを中断するか、またはsleepメソッドの時間が経過すると、sleepメソッドの実行は完了します。 | notify()またはnotifyAll()メソッドがそれを中断すると、waitメソッドの実行は完了します。 |
静的 | スリープメソッドは静的メソッドです。 | waitメソッドは静的ではないので、それを呼び出すためにオブジェクトが必要です。 |
実行 | sleepメソッドは現在のスレッドで実行されます。 | オブジェクトに対してwaitメソッドが実行されます。 |
例外 | InterruptedException | IllegalArgumentException、IllegalMonitorStateException、InterruptedException。 |
スリープ方法の定義
sleepメソッドはThreadクラスの静的メソッドです。 スレッドが特定の時間タスクを実行したくない場合に、sleepメソッドが呼び出されます。 sleepメソッドは、そのメソッドの時間が経過したとき、または実行中に他のスレッドによって中断されたときに、実行を完了します。 sleepメソッドが完了した後、スレッドは再び実行可能ステータスになります。 以下に示すように、スリープ方法には2つの方法があります。
public static native voidスリープ(ミリ秒); public static void sleep(長ミリ秒およびintナノ秒)。
上記の2つの形式では、時間が睡眠方法の両方の形式で言及されているのを観察できます。 これは、スレッドが常にパラメータで指定された特定の時間スリープするためです。 sleepメソッドは実行中に他のスレッドによって中断される可能性があります。 したがって、InterruptedExecptionをスローする可能性があります。 例外はtry / catchブロックまたはThrowsキーワードのいずれかによって処理されるように注意する必要があります。そうしないと、コンパイル時エラーが発生します。 sleepメソッドは、実行中の現在のオブジェクトに対するロックを保持し、実行が終了するまで他のオブジェクトの実行を許可しません。
待機方法の定義
待機は、 Objectクラスで定義されているメソッドです。 waitメソッドは、同じリソースに対して複数のタスク(スレッド)が一度に1つずつ苦労している場合に使用されます。 waitメソッドが呼び出されると、waitメソッドを呼び出したオブジェクトのロックが解除されます。 そして、waitメソッドによって解放されたオブジェクトのロックをさらに再開するnotifyメソッドが呼び出されるまで、他のオブジェクトに実行される機会を提供します。 waitメソッドの形式は以下のとおりです。
待つ(); 待つ(長いミリ秒)。 待機(長いミリ秒、intナノ秒)。
上記の3つの形式のwaitメソッドと同様に、最初のメソッドにはtimeパラメータがありません。これは、notifyメソッドが実行されるまでwaitメソッドの実行が続行されるか、notifyAllメソッドが呼び出されないことを意味します。 残りの2つのメソッドは時間パラメータを持ちます。 そのため、期限が切れるまで、またはnotifyまたはnoitfyAllメソッドが期限切れより早く呼び出されるまで実行されます。 waitメソッドは例外をスローする可能性があります。 渡されたtime引数が負の場合、IllegalArgumentException。 現在のスレッドがリソースを使用していない場合はIllegalMonitorStateException。 waitメソッドが中断された場合はInterruptedException。
Javaでのスリープと待機方法の主な違い
- sleepメソッドとwaitメソッドを区別する主な点は、sleepメソッドは、中断されるまで、またはオブジェクトの有効期限が切れるまで、オブジェクトに対するロックを保持することです。 ただし、waitメソッドはそれを呼び出したオブジェクトのロックを解除し、他のオブジェクトに実行の機会を与えます。
- sleepメソッドはThreadクラスで定義されていますが、waitメソッドはObjectクラスで定義されています。
- sleepメソッドは同期コンテキストから呼び出す必要はありません。 しかしwaitメソッドはsynchronizedから呼び出す必要があります。
- メソッドの時間が満了するか、他のスレッドによって中断されると、スリープメソッドが起こされます。 waitメソッドが起こされます
notifyまたはnotify Allメソッドが呼び出されたとき - sleepメソッドは静的メソッドですが、waitメソッドは静的メソッドではありません 。
- sleepメソッドは現在のスレッドで実行されますが、waitメソッドはそれを呼び出したオブジェクトで実行されます。
- sleepメソッドによってスローされる例外はInterruptedExceptionですが、waitメソッドによってスローされる例外はIllegalArgumentException、IllegalMonitorStateException、InterruptedExceptionです。
結論:
複数のスレッドが同じリソースを1つずつ使用したい場合は、waitメソッドを使用する必要があります。 スレッドがタスクを実行したくない場合は、sleepメソッドを使用する必要があります。