Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのsleep()とwait()の違いを徹底解説!マルチスレッドプログラミングの基礎知識

Javaでマルチスレッドプログラミングを行う際、sleep()メソッドとwait()メソッドはどちらもスレッドの実行を一時停止させるために使われますが、その動作や用途には重要な違いがあります。本記事では、それぞれの特徴と相違点をわかりやすく解説します。

wait()メソッドとは

  • 所属クラス: Objectクラスに定義されており、すべてのオブジェクトが持つメソッドです。
  • ロックの扱い: 同期(synchronized)処理中に呼び出されると、オブジェクトのロックを解放します。これにより、他のスレッドが同じロックを取得できるようになります。
  • メソッドの種類: インスタンスメソッドであり、静的(static)メソッドではありません。
  • 呼び出し条件: 必ず同期ブロックまたは同期メソッド内から呼び出す必要があります。同期コンテキスト外で呼び出すとIllegalMonitorStateExceptionがスローされます。
  • オーバーロード: 以下の3つの形式が用意されています。
    • wait()
    • wait(long timeout): タイムアウト時間をミリ秒で指定
    • wait(long timeout, int nanos): ミリ秒とナノ秒で指定

sleep()メソッドとは

  • 所属クラス: Threadクラスに定義されています。
  • ロックの扱い: 同期処理中であっても、オブジェクトのロックは解放されません。そのため、他のスレッドはロックが解放されるまで待ち続けることになります。
  • メソッドの種類: 静的(static)メソッドです。
  • 呼び出し条件: synchronizedブロック内から呼び出す必要はなく、任意の場所で使用できます。
  • オーバーロード: 以下の2つの形式が用意されています。
    • sleep(long millis): 一時停止時間をミリ秒で指定
    • sleep(long millis, int nanos): ミリ秒とナノ秒で指定

sleep()とwait()の比較まとめ

項目wait()sleep()
定義されているクラスObjectクラスThreadクラス
ロックの解放するしない
静的/非静的非静的(インスタンスメソッド)静的メソッド
synchronized内での呼び出し必須不要
再開のタイミングnotify()/notifyAll()の呼び出し、またはタイムアウト指定時間の経過後
主な用途スレッド間通信・協調制御一定時間の実行停止

使い分けのポイント

wait()は、他のスレッドからの通知(notify()/notifyAll())を待つスレッド間の協調処理に適しています。一方、sleep()は単純に一定時間だけ処理を止めたい場合に便利です。ロックの扱いが大きく異なるため、意図しないデッドロックやパフォーマンス低下を避けるためにも、両者の違いを正しく理解して使い分けることが重要です。

  1. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って

  2. Javaのwait()メソッドとsleep()メソッドの違いを徹底解説

    Javaのマルチスレッドプログラミングでは、sleep()メソッドとwait()メソッドのどちらもスレッドの処理を一時停止させるために使用されますが、両者にはいくつかの重要な違いがあります。本記事では、それぞれの特徴と相違点をわかりやすく解説します。 sleep()メソッドとwait()メソッドの主な違い 1. メソッドの種類と影響範囲 sleep()メソッドはThreadクラスのstatic(静的)メソッドであり、呼び出すと現在実行中のスレッドを「実行不可能(Non-Runnable)」状態にします。 一方、wait()メソッドはインスタンスメソッドであり、スレッドオブジェクトではなく対象の