「こんにちは、アミーゴ! エリーがスレッドについて教えてくれました。私はスレッドをどのように操作するかを説明します。新しいスレッドを作成するには、次の手順を実行する必要があります。」

1)  Thread オブジェクトを作成する

2)実行したいメソッドを渡します

3) 作成された Thread オブジェクトの start メソッドを呼び出します。

次の例を考えてみましょう。

コード 説明
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
Runnableインターフェイスを実装するクラス。
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 run メソッドを実装する Printer クラスのインスタンスを作成します。
2 新しい Thread オブジェクトを作成します。コンストラクターにプリンター オブジェクトを渡します。その run() メソッドを呼び出す必要があります。3 start()
メソッド を呼び出して、新しいスレッドを開始します。

小さな Java プログラムは通常、「メイン スレッド」と呼ばれる 1 つのスレッドで構成されます。ただし、プログラムは「子スレッド」と呼ばれる追加のスレッドを起動することがよくあります。メインスレッドは main メソッドを実行して終了します。Runnableの run メソッドは、子スレッドの同様のメソッドです。

「ああ、スレッドがたくさんあるということは、main メソッドがたくさんあることを意味します。」

新しいスレッドの作成と開始 - 1

Thread オブジェクトにどの特定のメソッドを開始するかを指示するには、何らかの方法でメソッドを渡す必要があります。Java では、これはRunnableインターフェイスを使用して行われます。このインターフェイスには、単一の抽象メソッドvoid run()が含まれています。Thread クラスにはThread(Runnable Runnable)コンストラクターがあります。Runnableインターフェイスを実装する任意のオブジェクトを渡すことができます。

クラスはRunnableを継承し、そのrunメソッドをオーバーライドする必要があります。このメソッドを呼び出すと、新しいスレッドが開始されます。runメソッドには何でも記述できます。

コード 説明
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Runnableインターフェイスを実装するクラス。
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Jack");
Thread thread2 = new Thread(printer2);
thread2.start();
}
2 つのスレッドを作成し、それぞれが独自の Printer オブジェクトに基づきます。
public static void main(String[] args)
{
Printer printer = new Printer("Natasha");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
1 つの Printer オブジェクトに基づいて 3 つのスレッドを作成します。

さらに、これらすべてを 1 つのクラスに組み合わせることができます。Thread クラスは Runnable インターフェイスを継承しているため、必要なのはそのrun メソッドをオーバーライドすることだけです。

新しいスレッドを作成する別の方法
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Runnableインターフェイスを実装するThreadクラスを継承し、runメソッドをオーバーライドします。
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

Printer printer2 = new Printer("Jack");
printer2.start();

}
2 つのスレッドを作成し、それぞれが独自のPrinterオブジェクトに基づきます。

「これはより洗練されたソリューションです。」

「はい、しかし、欠点もあります。」

1) ナターシャの例のように、単一のオブジェクトに基づいて複数のスレッドを開始する必要がある場合があります。

2)  Thread クラスから継承する場合、別の親クラスをクラスに追加することはできません。

3) クラスに親クラスがある場合、Thread を 2 番目の親クラスとして追加することはできません。

「つまり、startメソッドが呼び出された後、各スレッドはコンストラクタに渡されたオブジェクトのrunメソッドの実行を開始するということですか?」

「はい。コンストラクターに何も渡されない場合、Thread は内部の run メソッドを実行するだけです。」

「しかし、このようにメソッドを呼び出してみてはどうでしょうか?」

コード
public static void main(String[] args)
{
 Printer printer1 = new Printer("Nick");
 printer1.run();
}

"メインスレッドがrunメソッドに到達すると、その「小さなロボット」は単純に内部に入り、その中のすべてのコマンドを実行します。それらが実行された後でのみ、メインメソッドに戻り、さらにコマンドの実行を続けます。したがって、2 番目のコマンドは実行されません。"小さなロボット」が作成されます。すべての作業は並行 (同時に) ではなく、順番に実行されます。

「なるほど。run 以外の何か別のメソッドを呼び出すことはできますか?」

「いいえ。すべては Runnable インターフェイスに関連付けられており、Runnable インターフェイスはそのメソッドの 1 つ、 run()についてのみ「知っています」。