マルチスレッドとは?

マルチスレッドの処理の仕組み

夕食の支度に忙しい母親は、1度に色々な事に目を光らせています。
例えば、炊飯器が御飯を炊き終わる迄其れだけをずっと監視していて、他の事が全く目に入らない状況を想像してみて下さい。
お湯が沸いても、其れに気付かずやかんのお湯は沸騰し続ける事になります。
そして、御飯が炊けてやっと御飯の監視から解放された頃には、お湯は全部沸騰して無くなって終っていた等と言う事にもなりかねません。
そうならない様に、何時どんな仕事をすると効率が良いかを分担して作業します。
仕事を細かく分け、それぞれの仕事を同時に並行して行っています。
Javaでは、1つの仕事に1つのスレッドを割り当てます。

スレッドとは、仕事の単位です。

マルチスレッドとシングルスレッドの違い

シングルスレッドは、処理の流れが1つしか有りません。
「計算処理1」〜「計算処理3」は互いに関係なく、どれから処理を行っても結果には影響しない物としましょう。
「計算処理1」が終了しない中は、他の事が何も出来ません。
「計算処理1」のキーボード入力待ちの時に、ユーザからのリクエストが有っても「計算処理1」が終わらない限り、受け付けられないのです。
此の様なシーケンスは無駄な待ち時間が長く、応答が遅いシステムと言えるでしょう。
其処で処理を細かく分け、準備の整った処理から先に実行出来る様に、順序を変更してみましょう。
こうしておけば、「計算処理1」が終わらなくても「計算処理2」やユーザからのリクエスト処理を開始出来ます。
此の様に、各処理を独立して実行出来る仕組みをマルチスレッドと言います。

実際には、1つのCPUで同時に処理出来るのは1つだけなので、CPUを切り替えて複数の処理をこなす事になります。
処理の途中で、別の処理に切り替わる事も有ります。
此を割り込みと言います。

複数のオブジェクト

前の例は、異なる処理を同時に行うケースでしたが、今度は同じクラスの複数のオブジェクトをターゲットに同時に実行するケースを考えてみましょう。
有るユーザの処理に時間が掛かった場合、他のユーザはリクエストを受け付けて貰えません。
「時間の掛かる処理」と言うのが、唯何かを待っているだけ(つまり何も処理をしていない空いている状態)だったとしても、其の空いている時間に他のユーザのリクエストさえ受け付けられません。
つまり、ループの中で行うのは処理を依頼する事だけで、其の処理が終わっていなくても次のリクエストを受け付けられます。
此の仕組みは、ネットワーク上のサーバの様に、複数のクライアントからの要求を出来るだけ早く受け付けて応答を返さなければならないシステムにとっては、必要不可欠な仕組みです。

時間待ち

「一定時間経過後、○○」と言う場合に、時間の経過をずっと監視し続ける必要は有りません。
休んでいてくれれば、其の間に別の処理が出来ます。

メモリの共有

マルチスレッドでは、互いに独立して実行しながらもメモリを共有出来ます。
一方で、オブジェクト内の変数を、それぞれ個々にも持てます。
共有しているメモリにスレッドから書き込む場合には、互いに排他制御が必要です。

戻る