はじめに
こんにちは ◤●ㅅ●◥ノ
今回は複数の処理を同時並行で実行するスレッドの考え方について学びました!
第16章 スレッドによる並列処理
1.処理効率の追求
Java実行の大原則
JVMは、命令を1つずつ順番に実行する
ある命令を完全に実行し終えてから次の命令を実行する
スレッド
JVM内でプログラムを1命令ずつ実行していくJVMのようなもの
→JVM君が増える
2.Javaにおける並列処理
スレッドにはThreadクラスを利用する
スレッドの使い方
1.Threadクラスを継承してrun()をオーバーライドする
run()には別のスレッドで処理したい内容を書き込む
2.別のスレッドの実行を開始したい場所で1のクラスをインスタンス化し、
start()を呼び出す
注意点
1.スレッドはrun()を実行し終えると自動消滅する
run()に定義された処理内容をすべて実行し終えると自動的に消滅する
2.stop()の利用は御法度
JVMの内部が以上な状態になってしまう可能性があることから、利用してはならない
3.JVMは全スレッドの終了をもって終了する
1つでも実行中のスレッドが残っているとJVMは終了しない
4.join()で別スレッドの終了を待つことができる
5.OSによって動作に違いが生じる可能性がある
6.例外は他のスレッドに伝播しない
7.同時に1つの変数を利用するとデータが壊れる
3.スレッドセーフな設計
複数のスレッドを利用したプログラミングのこと
→ マルチスレッドプログラミング
複数のスレッドを使うときの注意点
複数のスレッドが同時にアクセスしてデータが壊れる「スレッドの競合」
競合を避けるためにスレッドをコントロールすること
→スレッドの同期、調停、排他制御と呼ぶ
Javaにはスレッドを調停するための文法が複数用意されており、それらを上手く活用する
「複数のスレッドから同時に利用しても安全なクラスやメソッド」は スレッドセーフ な設計
スレッドの調停を行うにはsynchronizedブロックを利用する
スレッド調停を行うブロックの指定
synchronized (対象インスタンス){
スレッドの競合から保護したい処理
}
※実行できるのは1つのスレッドだけ
まとめ
スレッドを用いることで、複数の処理を同時に実行できる
スレッド内で例外が発生しても他のスレッドには伝播しない
同一の変数やメソッドを複数のスレッドから同時に利用すると、データが破壊される恐れがある
今回もありがとうございました!
ではまた〜 ◤●ㅅ●◥ノ"