#【Java スレッド処理編】
業務内で使用する Javaのスレッド処理のメモです。
開発時に使用しているのでまとめました。
##スレッドとは。
スレッド(thread)とは、プログラム上で複数の処理を同時に動かす仕組みである。
Javaには、複数の処理を同時に実行するAPIが備わっている。
→threadクラスを利用(スレッド生成)
・コンビニのレジを例に考えます。
昼休憩などで人がいっぱいで混雑時に、レジが1ヵ所だけだと時間がかかるし、不便。
レジが2ヵ所、3ヵ所と機能していれば短時間で人を捌けるし効率が良い。
プログラムも同じで処理を複数同時に動かせば、短時間で効率よく処理が可能になる。
その仕組みがスレッドです。スレッドは日常でもよく使われている。
##スレッド処理
###1、threadクラスを継承し、run( )メソッドをオーバーライドする。
run( )には、スレッドで処理したい内容を書き込む。
(オーバーライドとは、親クラスを継承して、子クラスを宣言時に親クラスのメンバを子クラス側で上書きすること)
###2、別スレッドの実行を開始したい場所で、①のクラスをインスタンス化して、start( )メソッドを呼ぶ。
(メソッドとは、複数の文をまとめて1つの処理として、名前を付けたもの。部品の最小単位)
//Threadを継承したクラスでは、スレッドで実行したい処理をrunメソッドの中に書く。
class Sample extends Thread {
public void run() {
System.out.println("スレッド");
}
}
//Threadを継承したクラスのインスタンスを生成し、startメソッドを呼び出し、スレッドを動かす。
class SampleSample {
public static void main(String[] args) {
ThreadSample t = new ThreadSample();
t.start();
}
}
//実行結果:スレッド
##run( )が作られ、start( )で新しいスレッドが実行される。
stop( )などは、致命的な障害に繋がることもあるものは基本的に使用しないのが賢明である。
###Thread.sleepの使い方
Javaプログラムの動作をスレッドの処理を一時停止したい時や何らかの処理待ちをしたい場合などに使用できる。
sleepはtry-catchとセットになるのが一般的。
ただ、sleep中に例外が発生しても何もすることはないのが普通なので、catchが空なのもごく普通である。
####※スレッドは、正しく恐れる必要がある。
なるべくスレッドを使わずに済む方法を考える。
マルチスレッドプログラムは、プログラム全体を設計段階から検討する必要がある。
やむを得ずスレッドを使う場合、大きなリスクを背負う覚悟をする。
開発期間や体制には、十分に余裕を持たせる。
→テストや問題の判別が難しい。開発工程全体に影響を与える事がある。
テストの同時実行が難しいために、厳密なテストが出来ずに本番稼働になることもある。
もしエラーが出たとしても、再現性がなく、原因の特定や不具合修正が難しい。
同一変数やメソッドを複数のスレッドから同時に利用すると、データ破壊の恐れがある。
//データ破壊を回避するために、synchronized で排他制御処理をする。
//実行できるのは、1スレッドのみ。
synchronized(対象インスタンス){
//複数スレッドから同時実行されないように保護したいコード
}