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

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

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

sleep()メソッドとwait()メソッドの主な違い

1. メソッドの種類と影響範囲

sleep()メソッドはThreadクラスのstatic(静的)メソッドであり、呼び出すと現在実行中のスレッドを「実行不可能(Non-Runnable)」状態にします。
一方、wait()メソッドはインスタンスメソッドであり、スレッドオブジェクトではなく対象のオブジェクトに対して呼び出します。そのため、影響を受けるのはそのオブジェクトに関連する処理だけです。

2. スレッドが再開される条件

sleep()メソッドの場合、指定した時間が経過するか、別のスレッドからinterrupt()メソッドが呼び出されると、スレッドは再開されます。
一方、wait()メソッドの場合は時間の経過に加えて、notify()またはnotifyAll()メソッドが呼び出されたときにもスレッドが再開されます。

3. ロック(モニター)の扱い

sleep()メソッドは待機中であっても、保持しているロックやモニターを解放しません
対照的に、wait()メソッドは待機状態に入る際に、保持していたロックやモニターを解放します。この違いが、synchronizedブロック内でwait()を利用できる理由でもあります。

sleep()メソッドの構文

public static void sleep(long millis) throws InterruptedException

wait()メソッドの構文

public final void wait() throws InterruptedException

サンプルコード

public class ThreadTest implements Runnable {
    private int number = 10;
    public void methodOne() throws Exception {
        synchronized(this) {
            number += 50;
            System.out.println("Number in methodOne(): " + number);
        }
    }
    public void methodTwo() throws Exception {
        synchronized(this) {
            Thread.sleep(2000); // sleep()メソッドの呼び出し
            this.wait(1000);    // wait()メソッドの呼び出し
            number *= 75;
            System.out.println("Number in methodTwo(): " + number);
        }
    }
    public void run() {
        try {
            methodOne();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        ThreadTest threadTest = new ThreadTest();
        Thread thread = new Thread(threadTest);
        thread.start();
        threadTest.methodTwo();
    }
}

実行結果

Number in methodOne(): 60
Number in methodTwo(): 4500

このように、sleep()とwait()は似た目的で使われることもありますが、「静的メソッドかインスタンスメソッドか」「ロックを解放するかどうか」「スレッドの再開条件」という観点で明確に異なります。それぞれの特性を理解して適切に使い分けることで、安全で効率的なマルチスレッド処理を実現できます。

  1. Javaのpaint()メソッドとrepaint()メソッドの違いをわかりやすく解説

    JavaでGUIアプリケーションを開発する際、コンポーネントの描画に関わるpaint()メソッドとrepaint()メソッドは、役割がまったく異なる重要なメソッドです。この記事では、両者の違いと正しい使い方を具体例とともに解説します。 paint()メソッドとrepaint()メソッドの違い paint()メソッドとは paint()は、コンポーネントを実際に描画するための処理(描画命令)を記述するメソッドです。Java AWTでは、このメソッドをオーバーライドして独自の描画処理を実装します。 一方、Java SwingではpaintComponent()メソッドをオーバーライドするのが推奨さ

  2. 【Java入門】printStackTrace()とgetMessage()の違いを徹底解説!例外情報の取得方法を使い分けよう

    Javaで発生した例外(Exception)の詳細情報を確認する方法は主に2つあります。それがprintStackTrace()メソッドとgetMessage()メソッドです。どちらもThrowableクラスに定義されたメソッドですが、出力される情報量や用途が大きく異なります。本記事では、それぞれの特徴と具体的な使い方をサンプルコード付きで解説します。 printStackTrace()メソッドとは java.lang.Throwableクラスで定義されており、java.lang.Errorクラスおよびjava.lang.Exceptionクラスに継承されています。 例外のクラス名、エラーメ