今まではThreadクラスを継承したクラスを作り、
run()メソッドをオーバーライドして、
インスタンス生成⇒start()メソッドってやっていたけど
なんだか違う方法でスレッド処理してる人がいた。
ということでThreadクラスについて基礎の復習メモ。
・Javaでは、個々のスレッドがすべてThreadクラスのインスタンスに相当する。
ということなので、Threadクラスを継承したクラスには変わりないのかな。
本読んでいたら、
スレッドに関する理解度を示すには、以下の質問に答えることができなければならない。
らしい。
それがこちら
1. 実行に当たって、スレッドはどのコードを実行するのか?
2. スレッドの状態にはどんなものがあるか?
3. スレッドの状態はどのように変化するか?
順番に復習しながら答えを書いていきます。
1. 実行に当たって、スレッドはどのコードを実行するのか?
スレッドを実行させるには、そのスレッドのstart()メソッドを呼ぶ。
これにより、スレッドスケジューラと呼ばれるコードに、そのスレッドが登録される。
スレッドスケジューラの役割は、任意の一時点において利用可能な
個々のCPU上でそれぞれどのスレッドが実際に実行されるかを決めること。
スレッドスケジューラの許可があってはじめて、スレッドが実行される。
スレッドは実行状態になったときは、run()メソッドが実行される。
スレッドに自分自身のrun()メソッドを実行させる場合は、
Threadクラスをサブクラス化(Threadクラスを継承したクラスを作成)し、
そのサブクラスでrun()メソッドを定義(オーバーライド)すればよい。
ここでrun()メソッドは直接呼ばず、サブクラスのインスタンスを生成し、
そのオブジェクトのstart()メソッドを呼び出す。
スレッドに自分以外のオブジェクトのrun()メソッドを実行させたい場合も、
Threadクラスのインスタンスを生成する必要がある。
ただし、Threadクラスのコンストラクタを呼び出すときに、
実行したいrun()メソッドをどのオブジェクトが所有しているかを指定する必要がある。
それには次のコンストラクタを利用する。
public Thread(Runnable target)
Runnableは、run()メソッドを1つだけ含んだインタフェースである。
したがってRunnableインタフェースを実装していれば、任意のオブジェクトをコンストラクタに渡すことができる。
たとえば、次のようなクラスを作成する。
public class TestThread implements Runnable{
public void run(){
//ここに処理
}
}
スレッドの実行は次のようにおこなう。
TestThread tt = new TestThread();
Thread t = new Thread(tt);
t.start();
ここで作成したTestThreadクラスのインスタンスは、
すべてThreadコンストラクタに渡されrun()メソッドを別スレッドで実行できる。
2. スレッドの状態にはどんなものがあるか?
スレッドの状態には次のものがある。
・実行中(Running) すべてのスレッドが目標とする状態
・実行不可能 待機状態、スリープ状態、サスペンド状態、ブロック状態
・実行可能(Ready) 他の条件が整い、CPU時間の割り当てだけを持っている状態
・死んでいる(Dead) すべてが終わった状態
長くなるので詳しいことはまた後日・・。
run()メソッドをオーバーライドして、
インスタンス生成⇒start()メソッドってやっていたけど
なんだか違う方法でスレッド処理してる人がいた。
ということでThreadクラスについて基礎の復習メモ。
・Javaでは、個々のスレッドがすべてThreadクラスのインスタンスに相当する。
ということなので、Threadクラスを継承したクラスには変わりないのかな。
本読んでいたら、
スレッドに関する理解度を示すには、以下の質問に答えることができなければならない。
らしい。
それがこちら
1. 実行に当たって、スレッドはどのコードを実行するのか?
2. スレッドの状態にはどんなものがあるか?
3. スレッドの状態はどのように変化するか?
順番に復習しながら答えを書いていきます。
1. 実行に当たって、スレッドはどのコードを実行するのか?
スレッドを実行させるには、そのスレッドのstart()メソッドを呼ぶ。
これにより、スレッドスケジューラと呼ばれるコードに、そのスレッドが登録される。
スレッドスケジューラの役割は、任意の一時点において利用可能な
個々のCPU上でそれぞれどのスレッドが実際に実行されるかを決めること。
スレッドスケジューラの許可があってはじめて、スレッドが実行される。
スレッドは実行状態になったときは、run()メソッドが実行される。
スレッドに自分自身のrun()メソッドを実行させる場合は、
Threadクラスをサブクラス化(Threadクラスを継承したクラスを作成)し、
そのサブクラスでrun()メソッドを定義(オーバーライド)すればよい。
ここでrun()メソッドは直接呼ばず、サブクラスのインスタンスを生成し、
そのオブジェクトのstart()メソッドを呼び出す。
スレッドに自分以外のオブジェクトのrun()メソッドを実行させたい場合も、
Threadクラスのインスタンスを生成する必要がある。
ただし、Threadクラスのコンストラクタを呼び出すときに、
実行したいrun()メソッドをどのオブジェクトが所有しているかを指定する必要がある。
それには次のコンストラクタを利用する。
public Thread(Runnable target)
Runnableは、run()メソッドを1つだけ含んだインタフェースである。
したがってRunnableインタフェースを実装していれば、任意のオブジェクトをコンストラクタに渡すことができる。
たとえば、次のようなクラスを作成する。
public class TestThread implements Runnable{
public void run(){
//ここに処理
}
}
スレッドの実行は次のようにおこなう。
TestThread tt = new TestThread();
Thread t = new Thread(tt);
t.start();
ここで作成したTestThreadクラスのインスタンスは、
すべてThreadコンストラクタに渡されrun()メソッドを別スレッドで実行できる。
2. スレッドの状態にはどんなものがあるか?
スレッドの状態には次のものがある。
・実行中(Running) すべてのスレッドが目標とする状態
・実行不可能 待機状態、スリープ状態、サスペンド状態、ブロック状態
・実行可能(Ready) 他の条件が整い、CPU時間の割り当てだけを持っている状態
・死んでいる(Dead) すべてが終わった状態
長くなるので詳しいことはまた後日・・。