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

JavaにおけるThreadとRunnableの違いを徹底解説!使い分けのポイント

Javaで新しいスレッドを作成する方法は主に2つあります。1つ目はThreadクラスを継承(extends)する方法、2つ目はRunnableインターフェースを実装(implements)する方法です。それぞれの特徴と違いを理解することで、状況に応じた適切な選択ができるようになります。

スレッド作成の2つの方法

1. Threadクラスを継承する方法

Threadクラスのサブクラスとして新しいクラスを宣言し、そのサブクラス内でrun()メソッドをオーバーライドします。その後、サブクラスのインスタンスを生成し、start()メソッドを呼び出すことでスレッドが実行されます。

2. Runnableインターフェースを実装する方法

Runnableインターフェースを実装したクラスを宣言し、run()メソッドを実装します。このクラスのインスタンスを生成し、Threadクラスのコンストラクタに引数として渡してからstart()メソッドを呼び出します。

スレッドの名前について

すべてのスレッドには識別用の名前が割り当てられます。複数のスレッドが同じ名前を持つことも可能です。スレッド生成時に名前を指定しなかった場合は、自動的に新しい名前が生成されます。

ThreadとRunnableの比較表

番号項目ThreadRunnable
1基本Threadはクラスであり、スレッドを作成するために使用されるRunnableは関数型インターフェースであり、スレッドを作成するために使用される
2メソッドstart()run()を含む複数のメソッドを持つ抽象メソッドはrun()のみ
3オブジェクト各スレッドが固有のオブジェクトを生成し、それに関連付けられる複数のスレッドが同じオブジェクトを共有できる
4メモリより多くのメモリが必要必要なメモリが少ない
5制限Javaでは多重継承が許されていないため、Threadクラスを継承すると他のクラスを継承できなくなるRunnableインターフェースを実装する場合でも、他のクラスを継承することが可能

Runnableの実装例

class RunnableExample implements Runnable {
    public void run() {
        System.out.println("Runnable実装によるスレッドが実行中です");
    }
    public static void main(String args[]) {
        RunnableExample runnable = new RunnableExample();
        Thread t1 = new Thread(runnable);
        t1.start();
    }
}

Threadの実装例

class ThreadExample extends Thread {
    public void run() {
        System.out.println("スレッドが実行中です");
    }
    public static void main(String args[]) {
        ThreadExample t1 = new ThreadExample();
        t1.start();
    }
}

どちらを選ぶべきか?

一般的にはRunnableインターフェースの実装が推奨されます。主な理由は以下の通りです。

  • Javaは単一継承しかサポートしていないため、Threadクラスを継承すると他のクラスを継承できなくなる
  • Runnableは「実行するタスク」と「スレッドの実行仕組み」を分離できるため、柔軟な設計が可能
  • 複数のスレッドで同じRunnableインスタンスを共有でき、メモリ効率に優れる
  • ExecutorServiceなどの高度な並行処理APIとの相性が良い

一方、Threadクラスを継承する方法は、シンプルなサンプルコードや学習用途には手軽ですが、実際の開発ではRunnableの実装、あるいはラムダ式を活用した記述が主流となっています。

  1. Javaにおける継承とコンポジション(構成)の違い徹底解説

    Javaのオブジェクト指向設計において、「継承(Inheritance)」と「コンポジション(構成・Composition)」はどちらもコードの再利用性を実現する重要な手法です。しかし、その考え方や使い方には大きな違いがあります。コンポジションとは、あるクラスの中に別クラスのインスタンスをフィールドとして持たせる設計技法です。一方、継承とは、既存のクラスを拡張(extends)することで、親クラスのプロパティや動作を子クラスが引き継ぐ仕組みです。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。継承とコンポジションの違い一覧No.比較項目継承(Inheritance

  2. Javaのwait()とsleep()の違いを徹底解説!ロック解放や起床条件の違いを比較

    Javaのマルチスレッドプログラミングにおいて、wait()とsleep()はどちらもスレッドの実行を一時停止させるメソッドですが、その動作には重要な違いがあります。本記事では、それぞれのメソッドの特徴を解説し、5つの観点から両者を比較します。 wait()メソッドとは wait()メソッドを呼び出すと、スレッドは現在保持しているモニター(ロック)の所有権を解放し、待機状態に入ります。その後、別のスレッドが同じオブジェクトのモニターに対してnotify()またはnotifyAll()メソッドを呼び出すことで、待機中のスレッドが起床されます。起床後も、スレッドはモニターの所有権を再取得できるまで