Java スレッド クラスもオブジェクト クラスであり、そのインスタンスはすべて java.lang.Thread またはそのサブクラスを継承します。次の方法で Java でスレッドを作成できます:
Tread thread = new Thread();
スレッドを実行するには、スレッドの start() メソッドを呼び出すことができます:
thread.start();
上の例では、スレッドなので、このメソッドを呼び出しました。その後、スレッドが終了します。
スレッドの実行時に実行されるコードを記述する方法は 2 つあります。1 つは Thread サブクラスのインスタンスを作成して run メソッドをオーバーライドする方法、もう 1 つはクラスの作成時に Runnable インターフェイスを実装する方法です。次に、これら 2 つのメソッドについて詳しく説明します。
Thread のサブクラスを作成します。
Thread サブクラスのインスタンスを作成し、run メソッドをオーバーライドします。 run メソッドは、start() メソッドの呼び出し後に実行されます。例は次のとおりです:
public class MyThread extends Thread { public void run(){ System.out.println("MyThread running"); }}
上記の Thread サブクラスは次の方法で作成して実行できます
MyThread myThread = new MyThread();myTread.start();
start メソッドは、スレッドが開始されると、run メソッドの実行が完了するのを待たずにすぐに戻ります。あたかも run メソッドが別の CPU で実行されているかのようです。 run メソッドが実行されると、文字列 MyThread running が出力されます。
次のように Thread の匿名サブクラスを作成することもできます:
Thread thread = new Thread(){ public void run(){ System.out.println("Thread Running"); }};thread.start();
新しいスレッドの run メソッドが実行されると、コンピューターは文字列「Thread Running」を出力します。
Runnable インターフェースを実装する
スレッド実行コードを記述する 2 番目の方法は、java.lang.Runnable インターフェースを実装するクラスの新しいインスタンスを作成することです。インスタンス内のメソッドはスレッドから呼び出すことができます。以下に例を示します。
public class MyRunnable implements Runnable { public void run(){ System.out.println("MyRunnable running"); }}
スレッドが run() メソッドを実行できるようにするには、MyRunnable のインスタンス オブジェクトを Thread クラスのコンストラクターに渡す必要があります。例は次のとおりです。
Thread thread = new Thread(new MyRunnable());thread.start();
スレッドの実行中に、Runnable インターフェイスを実装する run メソッドが呼び出されます。上の例では、「MyRunnable running」が出力されます。
同様に、以下に示すように、Runnable インターフェースを実装する匿名クラスを作成することもできます:
Runnable myRunnable = new Runnable(){ public void run(){ System.out.println("Runnable running"); }}Thread thread = new Thread(myRunnable);thread.start();
サブクラスを作成しますか、それとも Runnable インターフェースを実装しますか?
2 つの方法のどちらが優れているかについて明確な答えはありませんが、どちらも要件を満たしています。私の個人的な意見では、Runnable インターフェイスを実装することを好みます。スレッド プールは Runnable インターフェイスを実装するスレッドを効果的に管理できるため、スレッド プールがいっぱいの場合、スレッド プールが空になるまで新しいスレッドは実行のキューに入れられます。 Thread サブクラスを実装することでスレッドを実装する場合、これはさらに複雑になります。
Runnable インターフェースと Thread サブクラスを同時に実装する 2 つの方法を組み合わせる必要がある場合があります。たとえば、Thread サブクラスを実装するインスタンスは、Runnable インターフェイスを実装する複数のスレッドを実行できます。典型的なアプリケーションはスレッド プールです。
よくある間違い: start() メソッドの代わりに run() メソッドを呼び出す
スレッドを作成して実行するときによくある間違いは、以下に示すように、start() メソッドの代わりにスレッドの run() メソッドを呼び出すことです。 :
Thread newThread = new Thread(MyRunnable());newThread.run(); //should be start();
run() メソッドは期待どおりに呼び出されるので、最初は何も違和感はありません。ただし、実際には、 run() メソッドは、作成されたばかりの新しいスレッドによって実行されるのではなく、新しいスレッドを作成した現在のスレッドによって実行されます。つまり、上記の 2 行のコードを実行するスレッドによって実行されます。作成した新しいスレッドで run() メソッドを実行したい場合は、新しいスレッドの start メソッドを呼び出す必要があります。
スレッド名
スレッドを作成するときに、スレッドに名前を付けることができます。これは、異なるスレッドを区別するのに役立ちます。例: 複数のスレッドが System.out に書き込む場合、スレッド名を通じてどのスレッドが出力しているかを簡単に見つけることができます。例は次のとおりです。
MyRunnable runnable = new MyRunnable();Thread thread = new Thread(runnable, "New Thread");thread.start();System.out.println(thread.getName());
MyRunnable は Thread のサブクラスではないため、MyRunnable クラスには getName() メソッドがないことに注意してください。現在のスレッドの参照は、次の方法で取得できます:
Thread.currentThread();
したがって、次のコードを通じて現在のスレッドの名前を取得できます:
String threadName = Thread.currentThread().getName();
スレッド コードの例:
これは小さな例です。まず、main()メソッドを実行しているスレッド名を出力します。このスレッドは JVM によって割り当てられます。次に、10 個のスレッドを開始し、1 ~ 10 の名前を付けます。各スレッドは、自身の名前を出力した後に終了します。
public class ThreadExample { public static void main(String[] args){ System.out.println(Thread.currentThread().getName()); for(int i=0; i<10; i++){ new Thread("" + i){ public void run(){ System.out.println("Thread: " + getName() + "running"); } }.start(); } }}
スレッドの開始順序は規則的ですが、実行の順序は規則的ではないことに注意してください。つまり、スレッド No. 1 は、必ずしもその名前をコンソールに出力する最初のスレッドであるとは限りません。これは、スレッドが順番ではなく並列で実行されるためです。スレッドの実行順序はJvmやOSが決定するものであり、スレッドの起動順序とは必ずしも一致しません。
関連する推奨事項:
Java スレッド内のオブジェクトの同期と非同期のインスタンス分析
以上がJava スレッドを作成および実行するメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。