スレッド (thread)

スレッドの種類

ユーザー スレッド (user thread)

ユーザースレッドは、アプリケーションの開始によって必ず1つは作成されます。そしてすべてのユーザースレッドが終了すると、アプリケーションは終了します。

デーモン スレッド (daemon thread)

デーモンスレッドは、これを保持するユーザースレッドの終了に伴い消滅します。

関連クラス / インターフェイス

Threadクラス

コンストラクタ

Thread(ThreadGroup group, Runnable target, String name)

コンストラクタは次の6種類の省略形を持ちます。パラメータを省略した場合には、nameにはnを整数とする"Thread-" + nの形式の文字列が、targetgroupにはnullが渡されます。

  1. Thread()
  2. Thread(String name)
  3. Thread(Runnable target)
  4. Thread(Runnable target, String name)
  5. Thread(ThreadGroup group, String name)
  6. Thread(ThreadGroup group, Runnable target)
Thread (Java Platform SE 7)

Runnableインターフェイス

Runnableインターフェイスは処理の概念を抽象化して、処理をスレッドに関連付けます。Runnable (Java Platform SE 7 )

スレッドに特定の処理を提供するには、Runnableを実装しrun()メソッドを実装します。なおThreadはRunnableを実装しています。

void run()
run - Runnable (Java Platform SE 7 )

ThreadGroupクラス (スレッドグループ)

スレッドグループは関連する複数のスレッドをまとめ、1つの単位として扱うことを可能とします。スレッドグループにはほかのスレッドグループを含めることができ、それらは階層構造を持ちます。ThreadGroup (Java Platform SE 7 )

スレッドの作成方法

Threadクラスを継承

class Foo extends Thread {
    @Override
    public void run() {

        // バックグラウンド スレッド
        for (int i = 0; i < 10; i++) {
            System.out.print("a");
        }
    }
}
// メインスレッド
Foo foo = new Foo();
foo.start();

for (int i = 0; i < 10; i++) {
    System.out.print("A");
}

これを実行すると「AAAAAAAaaaaaaaaaaAAA」のように出力されます。

また無名内部クラスにすると、次のようにも記述できます。

Thread foo = new Thread() {
    @Override
    public void run() {

        // バックグラウンド スレッド
        for (int i = 0; i < 10; i++) {
            System.out.print("a");
        }
    }
};
foo.start();

// メインスレッド
for (int i = 0; i < 10; i++) {
    System.out.print("A");
}

Runnableインターフェイスを実装

メインスレッドで実行

Runnable runnable = new Runnable() {
    @Override
    public void run() {
    }
};
runnable.run();

バックグラウンド スレッドで実行

バックグラウンドで実行するにはThreadクラスを生成する必要があるため、前述のThreadクラスを継承する方が簡単です。

Runnable runnable = new Runnable() {
    @Override
    public void run() {
    }
};
new Thread(runnable).start();

同期 (synchronize)

メソッドのロック

メソッドをsynchronized宣言することにより、複数のスレッドからそれらのメソッドにアクセスされたときに、スレッドが互いに干渉しないことが保証されます。

public class Bar {
    private int x;

    public synchronized void Add(int a) {
        x += a;
    }

    public synchronized int GetX() {
        return x;
    }
}

オブジェクトのロック

synchronizeをオブジェクトに対して適用することで、オブジェクトをロックできます。

synchronized ( ロックを獲得するオブジェクト ) {
    // ロック獲得時に実行する文
}

参考

参考書

Javaのドキュメントから検索