Java スレッドは、他のオブジェクトと同様のオブジェクト タイプです。スレッドは、java.lang.Thread クラスのインスタンス、またはこのクラスのサブクラスのインスタンスです。 Java スレッドはオブジェクト タイプであるだけでなく、コードを実行することもできます。
スレッドの作成と開始
スレッドの作成は次のように行うことができます:
Thread thread = new Thread();
Java スレッドを開始するには、次のように start メソッドを呼び出す必要があります:
thread.start();
この例ではどのスレッドがコードを実行するかは指定しません。このスレッドは開始後すぐに停止されます。
このスレッドが実行するコードを指定するには 2 つの方法があります。最初の方法は、スレッドのサブクラスを作成し、 run() メソッドをオーバーライドすることです。 2 番目の方法は、Runnable インターフェイスを実装するオブジェクトを Thread コンストラクターに渡すことです。両方の方法については以下で説明します。
スレッド サブクラス
スレッドが実行するコードを指定する最初の方法は、スレッド サブクラスを作成し、run() メソッドをオーバーライドすることです。この run() メソッドは、start() メソッドを呼び出した後、このスレッドによって実行されます。以下に例を示します:
public class MyThread extends Thread { public void run(){ System.out.println("MyThread running"); } }
上記のスレッドを作成して開始するには、次のように実行できます:
MyThread myThread = new MyThread(); myTread.start();
スレッドが開始されるとすぐに、start() メソッドが戻ります。 run() メソッドが終了するまで待機しません。この run() メソッドは異なる CPU によって実行されます。この run() メソッドが実行されると、「MyThread running」というテキスト コンテンツが出力されます。
次のようなスレッドの匿名サブクラスを作成することもできます:
Thread thread = new Thread(){ public void run(){ System.out.println("Thread Running"); } } thread.start();
この例の結果は上記と同じになります。
Runnable インターフェースの実装
スレッドが実行するコードを指定する 2 番目の方法は、java.lang.Runnable インターフェースを実装するクラスを作成することです。この Runnable オブジェクトはスレッドによって実行できます。
ここに例を示します:
public class MyRunnable implements Runnable { public void run(){ System.out.println("MyRunnable running"); } }
run メソッドをスレッドで実行するには、MyRunnable インスタンスをスレッドのコンストラクターに渡す必要があります。以下に例を示します:
Thread thread = new Thread(new MyRunnable()); thread.start();
このスレッドが開始されると、独自の run メソッドを実行する代わりに、MyRunnable の run メソッドを呼び出します。上の例では、「MyRunnable running」というテキストが出力されます。
次のような匿名実装を作成することもできます:
Runnable myRunnable = new Runnable(){ public void run(){ System.out.println("Runnable running"); } } Thread thread = new Thread(myRunnable); thread.start();
スレッドを継承しますか、それともインターフェイスを実装しますか?
2 つの方法のうちどちらが最適であるかについてのルールはありません。どちらの方法でも機能します。ただし、私個人としては、Runnable インターフェイスを実装し、この実装のインスタンスを Thread インスタンスとして管理することを好みます。スレッド プールによって実行される Runnable 実装がある場合、プールのスレッドが空くまで Runnable インスタンスをキューに入れるのは簡単です。 Thread サブクラスを使用してこれを実現するのは少し困難です。
通常、Runnable を実装するだけでなく、サブクラス Thread も実装する必要があります。たとえば、Thread サブクラスを作成すると、複数の Runnable を実行できます。これは、スレッド プールを実装する典型的な例です。
よくある落とし穴: start() の代わりに run() を呼び出す
スレッドを作成して開始するとき、よくある間違いは、次のように、start メソッドの代わりに Thread の run メソッドを呼び出すことです。 Runnable の run メソッドも期待どおりに実行されるため、おそらく何も気付かなかったでしょう。ただし、作成した新しいスレッドによっては実行されません。作成したスレッドを置き換えたスレッドの run メソッドが実行されます。言い換えれば、上記の 2 行のコードが実行されるスレッドです。新しく作成されたスレッド インスタンスの run メソッドを呼び出すには、start メソッドを呼び出す必要があります。
スレッド名 Java スレッドを作成するときに、名前を付けることができます。この名前は、異なるスレッドを区別するのに役立ちます。たとえば、複数のスレッドがこの出力を書き込んだ場合、どのスレッドがどのテキストを書き込んだのかがわかります。以下に例を示します:
Thread newThread = new Thread(MyRunnable()); newThread.run(); //should be start();
Thread thread = new Thread("New Thread") { public void run(){ System.out.println("run by: " + getName()); } }; thread.start(); System.out.println(thread.getName());
Thread.currentThread()このメソッドは、実行されている現在のスレッドの Thread インスタンスへの参照を返します。このようにして、コードのブロックを実行しているスレッドの Thread オブジェクトにアクセスできます。以下に例を示します。
MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable, "New Thread"); thread.start(); System.out.println(thread.getName());
Thread thread = Thread.currentThread();
这里有一个小的例子。首先它打印出来了正在执行的main方法的线程的名字。这个线程是被JVM分配的。然后启动了10个线程,以及给予他们所有作为名称(“”+i)的一个数字。每一个线程然后打印出名字,以及停止执行。
Java Thread Instancepublic 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();
}
}
}
注意,甚至如果线程是按顺序启动的(1,2,3等等)。他们可能也不会按顺序执行的,意味着线程1可能不是第一个打印出来的名字。这个就是为什么原则上线程是并行运行而不是顺序呢执行的原因了。这个JVM以及操作系统决定着线程执行的顺序。这个顺序每次在他们启动的时候都不会相同的。
以上就是创建以及启动一个Java线程的内容,更多相关内容请关注PHP中文网(www.php.cn)!