Java - スレッドの作成
こんにちは、将来のJavaの魔法使いたち!今日は、Javaのスレッドのワクワクする世界に飛び込みます。プログラミングが新しい方でも心配しないでください。私は这些年間、無数の生徒をガイドしてきましたように、あなたをこの旅にステップバイステップで導きます。で、お気に入りの飲み物を用意して、リラックスし、一緒にこのスレッドの冒険に乗り出しましょう!
スレッドとは?
スレッドの作成に飛び込む前に、まずスレッドが実際に何であるかを理解しましょう。キッチンで美味しい料理を作っているとします。野菜を切ったり、ソースをかき混ぜたり、オーブンを確認したり、すべて同時にやっています。これらのタスクのそれぞれが、コンピュータープログラム内のスレッドに似ています。それらは並行して実行できる独立したタスクです。
Javaでは、スレッドはプログラム内で実行される最も小さな単位です。これにより、プログラムの異なる部分が同時に実行され、アプリケーションがより効率的で反応性が高くなります。
スレッドを使う理由
「なぜスレッドを使う必要があるのか?」と思っているかもしれません。私があなたに小さな話をしましょう。数年前、私はフォトグラフィッククラブ用のシンプルな画像処理アプリケーションを開発していました。小さな画像には問題ありませんでしたが、ユーザーが大きな高解像度の写真を処理しようとすると、アプリケーションが固まってしまいました。原因は何か?すべてが単一のスレッドで実行されていたからです!マルチスレッドを実装することで、画像をバックグラウンドで処理しながらユーザーインターフェースをリスポンスさせることができました。フォトグラフィッククラブのメンバーは喜び、スレッドの力について価値ある教訓を学びました。
Javaでスレッドを作成する方法
Javaでは、スレッドを作成する主要有効な方法が2つあります:
- Runnableインターフェースを実装する
- Threadクラスを拡張する
それぞれの方法を実際の例で探ってみましょう!
方法1: Runnableインターフェースを実装する
これは、Threadクラスをサブクラス化する必要がないため、好ましい方法とされています。あなたのクラスは他のクラスを拡張できる場合があります。
以下は簡単な例です:
public class MyRunnable implements Runnable {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("Runnableを使ったスレッド: " + i);
try {
Thread.sleep(1000); // 1秒間停止
} catch (InterruptedException e) {
System.out.println("スレッドが中断されました。");
}
}
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
// メインスレッド
for (int i = 1; i <= 5; i++) {
System.out.println("メインスレッド: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("メインスレッドが中断されました。");
}
}
}
}
これを分解すると:
-
MyRunnable
クラスを作成し、Runnable
インターフェースを実装します。 -
run()
メソッドをオーバーライドし、スレッドが開始されたときに実行される内容を定義します。 -
main
メソッドでMyRunnable
のインスタンスを作成し、新しいThread
オブジェクトに渡します。 - スレッドの
start()
メソッドを呼び出して実行を開始します。 - メインスレッドも数を表示し、両スレッドが同時に実行されることを示します。
このプログラムを実行すると、両スレッドの数が交錯して表示され、同時に実行されていることがわかります!
方法2: Threadクラスを拡張する
この方法では、Thread
クラスのサブクラスを作成し、そのrun()
メソッドをオーバーライドします。以下はその例です:
public class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("Threadクラスを拡張したスレッド: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("スレッドが中断されました。");
}
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
// メインスレッド
for (int i = 1; i <= 5; i++) {
System.out.println("メインスレッド: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("メインスレッドが中断されました。");
}
}
}
}
ここでの主な違いは:
-
MyThread
クラスはThread
をサブクラス化しており、Runnable
を実装していません。 -
MyThread
オブジェクトに対して直接start()
を呼び出すことができます。
两种方法の比較
どちらの方法も同じ結果を達成しますが、以下の考慮点があります:
特性 | Runnableインターフェース | Threadクラスを拡張する |
---|---|---|
柔軟性 | 他のクラスを拡張できる | 他のクラスを拡張できない(Javaは多重継承をサポートしない) |
考え方の分離 | タスクとスレッドを分ける | タスクとスレッドを1つのクラスにする |
再利用性 | より再利用可能 | より再利用不可能 |
リソース効率 | より効率的(スレッドプールで使用可能) | より非効率的 |
大多数のケースでは、Runnable
を実装する方法がより良い実践とされています。なぜなら、それはより多くの柔軟性を提供し、オブジェクト指向設計の原則に沿っているからです。
結論
おめでとうございます!Javaスレッドの世界への第一歩を踏み出しました。スレッドとは何か、なぜそれが役立つか、そしてどのように作成するかについての基本をカバーしました。 jugglerの練習のように、スレッドのマスターには練習が必要です。すぐに理解できない場合はあきらめず、実験を続ければ必ず達成できます!
次のレッスンでは、スレッドの同期とスレッド間の通信について深く掘り下げます。それまでに、ハッピーコーディングをし、あなたのスレッドが常にスムーズに進むことを祈っています!
Credits: Image by storyset