ユーザースレッドは、アプリケーションの開始によって必ず1つは作成されます。そしてすべてのユーザースレッドが終了すると、アプリケーションは終了します。
デーモンスレッドは、これを保持するユーザースレッドの終了に伴い消滅します。
Thread(ThreadGroup group, Runnable target, String name)
コンストラクタは次の6種類の省略形を持ちます。パラメータを省略した場合には、nameにはnを整数とする"Thread-" + nの形式の文字列が、targetとgroupにはnullが渡されます。
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Runnableインターフェイスは処理の概念を抽象化して、処理をスレッドに関連付けます。Runnable (Java Platform SE 7 )
スレッドに特定の処理を提供するには、Runnableを実装しrun()メソッドを実装します。なおThreadはRunnableを実装しています。
void run()run - Runnable (Java Platform SE 7 )
スレッドグループは関連する複数のスレッドをまとめ、1つの単位として扱うことを可能とします。スレッドグループにはほかのスレッドグループを含めることができ、それらは階層構造を持ちます。ThreadGroup (Java Platform SE 7 )
class MyClass extends Thread {
@Override
public void run() {
// バックグラウンド スレッド
for (int i = 0; i < 10; i++) {
System.out.print("a");
}
}
}
// メインスレッド
MyClass myClass = new MyClass();
myClass.start();
for (int i = 0; i < 10; i++) {
System.out.print("A");
}
これを実行すると「AAAAAAAaaaaaaaaaaAAA」のように出力されます。
また無名内部クラスにすると、次のようにも記述できます。
Thread thread = new Thread() { @Override public void run() { // バックグラウンド スレッド for (int i = 0; i < 10; i++) { System.out.print("a"); } } }; thread.start(); // メインスレッド for (int i = 0; i < 10; i++) { System.out.print("A"); }
Runnable runnable = new Runnable() { @Override public void run() { } }; runnable.run();
バックグラウンドで実行するにはThreadクラスを生成する必要があるため、前述のThreadクラスを継承する方が簡単です。
Runnable runnable = new Runnable() { @Override public void run() { } }; new Thread(runnable).start();
メソッドをsynchronized宣言することにより、複数のスレッドからそれらのメソッドにアクセスされたときに、スレッドが互いに干渉しないことが保証されます。
public class MyClass { private int x; public synchronized void Add(int a) { x += a; } public synchronized int GetX() { return x; } }
synchronizeをオブジェクトに対して適用することで、オブジェクトをロックできます。
synchronized ( ロックを獲得するオブジェクト ) {
// ロック獲得時に実行する文
}