「こんにちは、アミーゴ! エリーがスレッドについて教えてくれました。私はスレッドをどのように操作するかを説明します。新しいスレッドを作成するには、次の手順を実行する必要があります。」
1) Thread オブジェクトを作成する
2)実行したいメソッドを渡します
3) 作成された Thread オブジェクトの start メソッドを呼び出します。
次の例を考えてみましょう。
コード | 説明 |
---|---|
|
Runnableインターフェイスを実装するクラス。 |
|
1 run メソッドを実装する Printer クラスのインスタンスを作成します。 2 新しい Thread オブジェクトを作成します。コンストラクターにプリンター オブジェクトを渡します。その run() メソッドを呼び出す必要があります。3 start() メソッド を呼び出して、新しいスレッドを開始します。 |
小さな Java プログラムは通常、「メイン スレッド」と呼ばれる 1 つのスレッドで構成されます。ただし、プログラムは「子スレッド」と呼ばれる追加のスレッドを起動することがよくあります。メインスレッドは main メソッドを実行して終了します。Runnableの run メソッドは、子スレッドの同様のメソッドです。
「ああ、スレッドがたくさんあるということは、main メソッドがたくさんあることを意味します。」

Thread オブジェクトにどの特定のメソッドを開始するかを指示するには、何らかの方法でメソッドを渡す必要があります。Java では、これはRunnableインターフェイスを使用して行われます。このインターフェイスには、単一の抽象メソッドvoid run()が含まれています。Thread クラスにはThread(Runnable Runnable)コンストラクターがあります。Runnableインターフェイスを実装する任意のオブジェクトを渡すことができます。
クラスはRunnableを継承し、そのrunメソッドをオーバーライドする必要があります。このメソッドを呼び出すと、新しいスレッドが開始されます。runメソッドには何でも記述できます。
コード | 説明 |
---|---|
|
Runnableインターフェイスを実装するクラス。 |
|
2 つのスレッドを作成し、それぞれが独自の Printer オブジェクトに基づきます。 |
|
1 つの Printer オブジェクトに基づいて 3 つのスレッドを作成します。 |
さらに、これらすべてを 1 つのクラスに組み合わせることができます。Thread クラスは Runnable インターフェイスを継承しているため、必要なのはそのrun メソッドをオーバーライドすることだけです。
新しいスレッドを作成する別の方法 | |
---|---|
|
Runnableインターフェイスを実装するThreadクラスを継承し、runメソッドをオーバーライドします。 |
|
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()についてのみ「知っています」。
GO TO FULL VERSION