スレッド

スレッドもFW内部で動いているものが多いので、意識して使った事はないです・・・。
かなしす。

((φ(・д・。)ホォホォ

  • スレッドの実行方法
    • Runnableを実装するクラスを使う方法
      対象のクラスでrunを実装し、そのオブジェクトを引数にしてThreadオブジェクトを生成し、startを呼び出す。
class Sample implements Runnable{
    public static void main (String[] args) {
        new Thread ( new Sample() ) .start();
        System.out.println("main");
    }
    //run()は引数なし
    public void run() {
        System.out.println("run");
    }
}
    • Threadのサブクラスを使う方法
      対象のクラスでrunをオーバーライドし、startを呼び出す。
class Sample2 extends Thread{
    int data;
    Sample2(int d) { data = d; }
    public static void main (String[] args) {
        new Sample2(5).start();
        System.out.println("main");
    }
    //run()は引数なし
    public void run() {
        System.out.println("run");
    }
}
  • ThreadがRunnableを実装している事にも注意しておく
  • runとstartの役割を理解しておく事。
  • オーバーライドまたは実装する際にrunに引数を持たせるようにすると、threadとして機能しなくなる。
  • 一度起動したthreadをもう1度起動することはできない。startを同一のthreadに対して複数回呼び出す事はできない。
    例外IllegalThreadStateExceptionが発生する。


つづき

  • yieldは現在実行中のスレッドを実行可能状態にするが、その後直ちに、同じスレッドが実行されるかもしれない。
  • waitは動機コンテキスト内からのみ呼び出せ、スレッドが取得していたロックを解放させ、そのスレッドを実行不可能状態(待機状態)にする。
  • waitに整数引数を与え、ミリ秒単位で、待機の最大時間を設定することができる。しかし、これで待機状態になったスレッドがnotifyによる通知を受け取ると、その最大待機時間以内でもロック探索状態になる。
  • sleepを使いスレッドを実行不可能状態(スリープ状態)にできるが、そのスレッドは取得しているロックを解放しない。
  • notifyallはそのオブジェクトのロックに関して待機しているすべてのスレッドに通知を送り、ロック探索状態にする。
  • joinは、「t.join();」(tがスレッドを参照するとする)をzっこうする事で、tの参照するスレッドが終了するまで、現在のスレッドの実行を停止させる。ただし、tの参照するスレッドが終了している場合、現在のスレッドは停止されない。