「こんにちは、アミーゴ! 新しい、非常に難しいトピックがあります。申し訳ありません。これは Java だけでなく、プログラミング全般において最も複雑なトピックの 1 つと考えられています。私はマルチスレッドについて話しています

たとえば、宇宙船レース ゲームなどの典型的なコンピュータ ゲームを想像してください。隕石や哨戒巡洋艦を避けながら、広大な宇宙を飛び回ります。他にも 20 人がこれらの違法レースにあなたと一緒に参加しています。

このようなゲームを作成することに決めたとしましょう。プログラムはコマンド (キーボード入力) を追跡し、宇宙船を動かし、軌道を計算し、衝突の結果を判断し、これらすべてをユーザーの画面上に描画する必要があります。これは非常に複雑な作業です。

成長を続ける海運会社の例で、「非常に複雑な問題」をどのように解決したか覚えていますか?

私たちはそれを独立した部門に分割し、それらがどのように連携できるかを厳密に指定(標準化)しました。

「しかし、独立した部分が他の部分と並行して何らかの作業を実行する必要がある場合はどうすればよいでしょうか?! この質問に対する答えはスレッドです。」

プログラムを、コード上を走り回ってコマンドを実行する小さなロボットとして想像してみてください。最初に 1 行のコマンドを実行し、次に次の行に移動する、という具合です。

「心の中ではわかります。簡単です!」

「非常に良いです。これらのロボットが複数あると想像してください。1 台がユーザー入力を処理している間、2 台目はその入力に基づいてオブジェクトを更新しています。3 台目はコードを実行してこれらのオブジェクトを画面に表示します。1 秒間に数回、 4 つ目は船舶が衝突したかどうかを確認し、衝突した場合は衝突の結果を計算します。」

したがって、プログラムを独立した部分/オブジェクトに分割するだけでなく、これらの部分が互いに独立して作業を実行できるようにすることもできます。個々の部分間の相互作用が少ないほど、プログラムの複雑さは軽減されます。

マネージャーを手紙を送信するスクリプトに置き換えることができた と想像してください。そして、社内の他の部門は変化があったことさえわかりませんでした。この種のことは 26 世紀にはすでに起こり、素晴らしい結果が得られました。ほとんどのマネージャー、さらには経営幹部さえも、平均的な複雑さのスクリプトでうまく置き換えることができます。「オフィスプランクトン組合」が介入して初めて、管理者の大量解雇は終結した。しかし、私はそれました。

"なんて面白い!"

「これらの「小さなロボット」が複数存在してコードを実行できるだけでなく、相互に通信して新しいロボットを生成することもできます。」

「新しいロボットを生み出す?」

「はい、新しいタスクを実行するためです。現在のスレッド (ロボット) と同時に何らかのアクションを実行するには、別のロボット (別のスレッド) を作成すると有利な場合があります。」

これは良さそうですが、どこに使うか思いつきません。

そして、なぜそれらを「スレッド」と呼ぶのでしょうか?

「それぞれのロボットが異なる色であり、コマンドを実行するときにその色でコマンドをマークすると想像してください。小さなロボットがたどる道は、鉛筆で残された線のようなものです。この道は、ロボットの後ろに糸のようにつながっています針。"

それぞれの「小型ロボット」には、実行するために作られたタスクがあります。スレッドは、このタスクの実行中に実行されるコマンドのセットであると考えることができます。

荷物を届けるために宇宙船に乗っているとします。次に、«貨物を配達する» があなたのタスクであり、あなたはそれを実行している最中です。そしてあなたの飛行経路はあなたの糸です。新しいタスク、まだ完了していないタスクにはそれぞれ独自のスレッド (まだ通過する必要があるパス) があると言えます。

「言い換えれば、タスクと、それを実行する「小さなロボット」が存在するということです。そして、スレッドは、ロボットがタスクを完了する間にたどる経路にすぎないのですか?」

"その通り。"

それがすべてが奥深くで機能する方法です。コンピュータにはプロセッサが 1 つしかないため、一度に 1 つのコマンドしか実行できません。つまり、プロセッサは常にスレッドを切り替えます。新しいスレッドに切り替えて、いくつかのコマンドを実行し、次に次のスレッドに切り替えて、いくつかのコマンドを実行します。しかし、スレッド間の切り替えは 1 秒間に数百回行われるため、すべてのスレッドが同時に実行されているように見えます。

マルチスレッド - 1