Java - スレッドの作成

こんにちは、将来のJavaの魔法使いたち!今日は、Javaのスレッドのワクワクする世界に飛び込みます。プログラミングが新しい方でも心配しないでください。私は这些年間、無数の生徒をガイドしてきましたように、あなたをこの旅にステップバイステップで導きます。で、お気に入りの飲み物を用意して、リラックスし、一緒にこのスレッドの冒険に乗り出しましょう!

Java - Creating a Thread

スレッドとは?

スレッドの作成に飛び込む前に、まずスレッドが実際に何であるかを理解しましょう。キッチンで美味しい料理を作っているとします。野菜を切ったり、ソースをかき混ぜたり、オーブンを確認したり、すべて同時にやっています。これらのタスクのそれぞれが、コンピュータープログラム内のスレッドに似ています。それらは並行して実行できる独立したタスクです。

Javaでは、スレッドはプログラム内で実行される最も小さな単位です。これにより、プログラムの異なる部分が同時に実行され、アプリケーションがより効率的で反応性が高くなります。

スレッドを使う理由

「なぜスレッドを使う必要があるのか?」と思っているかもしれません。私があなたに小さな話をしましょう。数年前、私はフォトグラフィッククラブ用のシンプルな画像処理アプリケーションを開発していました。小さな画像には問題ありませんでしたが、ユーザーが大きな高解像度の写真を処理しようとすると、アプリケーションが固まってしまいました。原因は何か?すべてが単一のスレッドで実行されていたからです!マルチスレッドを実装することで、画像をバックグラウンドで処理しながらユーザーインターフェースをリスポンスさせることができました。フォトグラフィッククラブのメンバーは喜び、スレッドの力について価値ある教訓を学びました。

Javaでスレッドを作成する方法

Javaでは、スレッドを作成する主要有効な方法が2つあります:

  1. Runnableインターフェースを実装する
  2. 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("メインスレッドが中断されました。");
}
}
}
}

これを分解すると:

  1. MyRunnableクラスを作成し、Runnableインターフェースを実装します。
  2. run()メソッドをオーバーライドし、スレッドが開始されたときに実行される内容を定義します。
  3. mainメソッドでMyRunnableのインスタンスを作成し、新しいThreadオブジェクトに渡します。
  4. スレッドのstart()メソッドを呼び出して実行を開始します。
  5. メインスレッドも数を表示し、両スレッドが同時に実行されることを示します。

このプログラムを実行すると、両スレッドの数が交錯して表示され、同時に実行されていることがわかります!

方法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("メインスレッドが中断されました。");
}
}
}
}

ここでの主な違いは:

  1. MyThreadクラスはThreadをサブクラス化しており、Runnableを実装していません。
  2. MyThreadオブジェクトに対して直接start()を呼び出すことができます。

两种方法の比較

どちらの方法も同じ結果を達成しますが、以下の考慮点があります:

特性 Runnableインターフェース Threadクラスを拡張する
柔軟性 他のクラスを拡張できる 他のクラスを拡張できない(Javaは多重継承をサポートしない)
考え方の分離 タスクとスレッドを分ける タスクとスレッドを1つのクラスにする
再利用性 より再利用可能 より再利用不可能
リソース効率 より効率的(スレッドプールで使用可能) より非効率的

大多数のケースでは、Runnableを実装する方法がより良い実践とされています。なぜなら、それはより多くの柔軟性を提供し、オブジェクト指向設計の原則に沿っているからです。

結論

おめでとうございます!Javaスレッドの世界への第一歩を踏み出しました。スレッドとは何か、なぜそれが役立つか、そしてどのように作成するかについての基本をカバーしました。 jugglerの練習のように、スレッドのマスターには練習が必要です。すぐに理解できない場合はあきらめず、実験を続ければ必ず達成できます!

次のレッスンでは、スレッドの同期とスレッド間の通信について深く掘り下げます。それまでに、ハッピーコーディングをし、あなたのスレッドが常にスムーズに進むことを祈っています!

Credits: Image by storyset