Java でスレッドを作成するには、Thread クラスを使用する方法と Runnable インターフェイスを使用する方法の 2 つがあります。 Runnable インターフェイスを使用する場合は、Thread インスタンスを作成する必要があります。したがって、Thread クラスまたは Runnable インターフェイスを通じてスレッドを作成する場合は、Thread クラスまたはそのサブクラスのインスタンスを作成する必要があります。 Thread クラスのコンストラクターは 8 回オーバーロードされています。コンストラクターは次のとおりです。
Runnable インターフェイスを実装するクラスのインスタンス。 Thread クラスは Runnable インターフェイスも実装しているため、Thread クラスから継承されたクラスのインスタンスもターゲットとしてこのコンストラクターに渡すことができることに注意してください。
文字列名
スレッドの名前。この名前は、Thread インスタンスを作成した後、Thread クラスの setName メソッドを通じて設定できます。スレッド名が設定されていない場合、スレッドはデフォルトのスレッド名 Thread-N を使用します。N はスレッドが作成される順序であり、繰り返しのない正の整数です。
スレッドグループグループ
現在作成されているスレッドが属するスレッド グループ。スレッド グループが指定されていない場合、すべてのスレッドがデフォルトのスレッド グループに追加されます。スレッド グループの詳細については、後の章で詳しく説明します。
ロングスタックサイズ
スレッド スタックのサイズは通常、CPU ページの整数倍です。たとえば、x86 のページ サイズは 4KB です。x86 プラットフォームでは、デフォルトのスレッド スタック サイズは 12KB です。
通常の Java クラスは、Thread クラスを継承している限り、スレッド クラスになることができます。また、スレッド コードは、Thread クラスの start メソッドを通じて実行できます。 Thread クラスのサブクラスは直接インスタンス化できますが、実際にスレッドのコードを実行するには、サブクラス内で Thread クラスの run メソッドをオーバーライドする必要があります。次のコードは、Thread クラスを使用してスレッドを作成する例を示しています。
パブリッククラス Thread1 は Thread を拡張します
{
public void run()
{
System.out.println(this.getName());
}
public static void main(String[] args)
{
System.out.println(Thread.currentThread().getName());
スレッド 1 スレッド 1 = 新しいスレッド 1();
スレッド 1 スレッド 2 = 新しいスレッド 1 ();
thread1.start();
thread2.start();
}
}
上記のコードを実行した結果は次のようになります。
注: Java プログラムにはメインスレッドが必要です。一般に、このメイン スレッドの名前は main です。プログラム内に他のスレッドを作成することによってのみ、それを真のマルチスレッド プログラムとみなすことができます。つまり、マルチスレッド プログラムには複数のスレッドが必要です。
Thread クラスには、スレッド名を設定できるオーバーロードされたコンストラクターがあります。スレッドの作成時にコンストラクター メソッドを使用してスレッド名を設定するほかに、Thread クラスの setName メソッドを使用してスレッド名を変更することもできます。 Thread クラスのコンストラクターを通じてスレッド名を設定するには、Thread クラスのパブリック Thread (String name) コンストラクターを Thread のサブクラスで使用する必要があります。そのため、Thread のサブクラスに渡すためのスレッドも追加する必要があります。コンストラクターに名前を付けます。次のコードは、スレッド名を設定する例を示しています。
パブリッククラス Thread2 は Thread を拡張します
{
プライベート文字列誰。
public void run()
{
System.out.println(who + ":" + this.getName());
}
public Thread2(文字列誰)
{
素晴らしい();
this.who = 誰;
}
public Thread2(String who, String name)
{
スーパー(名前);
this.who = 誰;
}
public static void main(String[] args)
{
Thread2 thread1 = 新しい Thread2 ("thread1", "MyThread1");
Thread2 thread2 = 新しい Thread2 ("thread2");
スレッド 2 スレッド 3 = 新しいスレッド 2 (「スレッド 3」);
thread2.setName("MyThread2");
thread1.start();
thread2.start();
thread3.start();
}
011行目:公開サンプル2_2(文字列誰)
このコンストラクターには、who という 1 つのパラメーターがあります。このパラメーターは、現在作成されているスレッドを識別するために使用されます。スレッドのデフォルトのコンストラクター public Thread() は、このコンストラクターでも引き続き呼び出されます。
016行目: public sample2_2 (文字列誰、文字列名前)
このコンストラクターの who は最初のコンストラクターの who と同じ意味を持ち、name パラメーターはスレッドの名前です。このコンストラクターでは、Thread クラスの public Thread (String name) コンストラクターが呼び出されます。これは、018 行目の super (name) です。
main メソッドでは、thread1、thread2、thread3 の 3 つのスレッドが確立されます。このうち、thread1 は構築メソッドでスレッド名を設定し、thread2 は setName メソッドでスレッド名を変更し、thread3 はスレッド名を設定しません。
実行結果は次のとおりです。
注: start メソッドの呼び出しの前後に setName を使用してスレッド名を設定できますが、start メソッドの呼び出し後に setName を使用してスレッド名を変更すると、不確実性が生じます。つまり、run メソッドが実行されるまで setName が実行されない可能性があります。 runメソッドでスレッド名を使用したい場合、setNameメソッドを呼び出してもスレッド名が変更されない現象が発生します。
Thread クラスの start メソッドを複数回呼び出すことはできません。たとえば、thread1.start() メソッドを 2 回呼び出すことはできません。それ以外の場合は、IllegalThreadStateException がスローされます。