ユーザースレッドは、アプリケーションの開始によって必ず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 ( ロックを獲得するオブジェクト ) {
// ロック獲得時に実行する文
}