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の比較表
| 番号 | 項目 | Thread | Runnable |
|---|---|---|---|
| 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の実装、あるいはラムダ式を活用した記述が主流となっています。
-
Javaにおける継承とコンポジション(構成)の違い徹底解説
Javaのオブジェクト指向設計において、「継承(Inheritance)」と「コンポジション(構成・Composition)」はどちらもコードの再利用性を実現する重要な手法です。しかし、その考え方や使い方には大きな違いがあります。コンポジションとは、あるクラスの中に別クラスのインスタンスをフィールドとして持たせる設計技法です。一方、継承とは、既存のクラスを拡張(extends)することで、親クラスのプロパティや動作を子クラスが引き継ぐ仕組みです。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。継承とコンポジションの違い一覧No.比較項目継承(Inheritance
-
Javaのwait()とsleep()の違いを徹底解説!ロック解放や起床条件の違いを比較
Javaのマルチスレッドプログラミングにおいて、wait()とsleep()はどちらもスレッドの実行を一時停止させるメソッドですが、その動作には重要な違いがあります。本記事では、それぞれのメソッドの特徴を解説し、5つの観点から両者を比較します。 wait()メソッドとは wait()メソッドを呼び出すと、スレッドは現在保持しているモニター(ロック)の所有権を解放し、待機状態に入ります。その後、別のスレッドが同じオブジェクトのモニターに対してnotify()またはnotifyAll()メソッドを呼び出すことで、待機中のスレッドが起床されます。起床後も、スレッドはモニターの所有権を再取得できるまで