
【Java】シングルスレッドとマルチスレッド
Javaのスレッド(thread)とは、プログラムの実行単位を表しており、ひとつのプログラム(プロセス)の中で複数の処理の流れを走らせることができます。そうすることで、複数のタスクを同時に処理することができます。スレッドをJavaで使うためのクラスjava.lang.Threadを指す言葉でもあります。
簡単な例で考えてみると、家で家事をする場面を考えてみます。独身のまま、洗濯、掃除、料理をすると一つ一つ終わらせてから次の家事に移行するので時間がかかってしまいます。ただ、結婚して二人で同じ作業を行うと、半分もしくは半分以下の時間で終わらせることができます。それと同じで、プログラムでも処理を複数同時に動かせば、短い時間で効率よく処理できます。その仕組みがスレッドです。スレッドは、今ではごく当たり前に使われているのです。
スレッドにはシングルスレッドとマルチスレッドがあります。今回は、シングルスレッドとマルチスレッドの特徴についてまとめていきたいと思います。
1. シングルスレッド

シングルスレッドはそのままの意味でプログラムが一つだけのスレッドで実行されることを言い、複数の処理が同一に処理されることはありません。シングルスレッドのプログラムではタスクは順番に処理され、一つのタスクが完了するまで次のタスクは実行されません。これにより、同時に複数の処理が行われないので、プログラムの挙動が理解しやすくなります。シングルスレッドを料理に例えて説明します。
シングルスレッドを味噌汁を作る料理に例えてみると、
①手を洗い、食器を準備する
②野菜と豆腐を切る
③お湯を沸かす
④切った野菜と豆腐を入れる
⑤味噌を入れる
⑥お椀によそう
大まかにはこの流れで味噌汁を作ると思います。処理を1本の線で引ける処理がシングル瀬レッドとよく言われています。シングルスレッドはこのように上から順番に処理が行われるものを言います。
ではシングルスレッドがどのような場面で使用されているか例をあげてみます。
2. シングルスレッドの使用例
・コマンドラインツール
シングルスレッドは簡単なものになりますが、コマンドラインツールやスクリプトでよく使用されています。例えば、ファイルの操作やデータの変換のように、単純な処理を順番に一つづつ実行する場合に適しています。
・シンプルなデータ処理
シングルスレッドは、データの読み取りや書き込み、変換などのシンプルなデータ処理に使用されています。例えば、ファイルの読み込みや書き込み、データベースの操作、文字列の処理などがこれに該当します。
・ユーザーインターフェース
シングルスレッドは、単純なユーザーインターフェース(UI)やダイアログボックスなどの表示に使用されることがあります。例えば、メッセージボックスを表示させたり簡単なフォームの入力処理などがこれに該当します。
・シーケンシャルなタスク処理
シングルスレッドは、特定のタスクを順番に実行する必要がある場合に使用されています。たとえば、データの処理や変換、ファイルの操作など、特定の順序で実行する必要があるタスクがこれに該当します。
・リアルタイム処理
シングルスレッドは、リアルタイム処理が必要な場合に使用されることがあります。特定の処理を常に同じ速度で実行する必要がある場合や、ハードウェア制御などのリアルタイム制御が必要な場合がこれに該当します。
3. シングルスレッドのメリット
・シンプルさ
シングルスレッドのプログラムは、複数のスレッドを管理する必要がないため、コードが簡潔で理解しやすい場合があります。
・予測可能性
シングルスレッドのプログラムは、タスクが順番に実行されるため、処理の流れが予測可能です。これにより、デバッグやトラブルシューティングが容易になります。
・リソースの節約
シングルスレッドのプログラムは、スレッドの切り替えや同期のオーバーヘッドが少ないため、リソースの消費が少ない場合があります。
4. シングルスレッドのデメリット
・効率の低さ
シングルスレッドのプログラムは、複数のタスクを同時に実行できないため、処理が遅くなる場合があります。
・応答性の低さ
シングルスレッドのプログラムは、1つのタスクが完了するまで次のタスクを処理できないため、応答性が低下する可能性があります。
・スケーラビリティの制限
シングルスレッドのプログラムは、処理能力を拡張する際に限界があります。複数のコアを持つCPUを活用できないため、スケーラビリティに制限が生じる場合があります。
以上がシングルスレッドの特徴と使用されている場面、メリット、デメリットになります。続いてマルチスレッドについてです。
5. マルチスレッド
マルチスレッドとはシングルスレッドとは変わってCPU が複数のコアにわたる多くのスレッドを同時に処理できる能力を利用したプログラミングの一種です。タスクや命令を 1 つずつ実行する代わりに、いっぺんに実行されます。つまり、処理の開始から終了まで線を引いたときに、枝分かれが発生する処理のこと。シングルスレッドに比べると処理は早くなりますが、内容が複雑になってしまいます。それでは、シングルスレッドと同様に味噌汁を作る方法を例にして挙げてみます。
マルチスレッドを味噌汁を作る料理に例えてみると、
①手を洗い、食器を準備する
②野菜と豆腐を切りながらお湯を沸かす
③切った野菜と豆腐を入れる
④味噌を入れる
⑤お椀によそう
この手順ではシングルスレッドと違い野菜を切る動作と、お湯を沸かす動作が同じタイミングになっています。この処理の流れに線を引こうとしても「手を洗い、食器を準備する」動作のあとは「野菜を切る」、「お湯を沸かす」のように処理が分岐してしまうと思います。1本では線が引けません。マルチスレッドはこのように1本で線が引けない複数に処理が分岐する処理のことをいいます。
ではマルチスレッドがどのような場面で使われているのでしょうか。
1.マルチスレッドの使用例
・UIアプリケーション
GUI(Graphical User Interface)のアプリケーションでは、ユーザーの操作とUIの更新を別々のスレッドで処理することが一般的です。ユーザーの操作を受け付けるためのメインスレッドと、UIの更新を行う専用のUIスレッドがあります。これにより、UIが応答しなくなることを防ぎ、ユーザーエクスペリエンスを向上させることができます。
・ネットワークプログラミング
ネットワークプログラミングでは、複数のクライアントからのリクエストを同時に処理する必要があります。その際マルチスレッドを使用することで、複数のクライアントとの通信を同時に処理し、効率的にリクエストを処理することができます。
・並列処理
並列処理は、複数のタスクを同時に処理するための方法になります。マルチスレッドを使用することで、計算やデータ処理などの複雑なタスクを分割し、複数のスレッドで同時に実行することができます。これにより、プログラムのパフォーマンスを向上させることができます。
・サーバーアプリケーション
サーバーアプリケーションでは、同時に複数のクライアントからのリクエストを処理する必要があります。マルチスレッドを使用することで、複数のクライアントとの通信を並行して処理し、効率的にリクエストを処理することができます。
・データベースアクセス
データベースアクセスでは、複数のクエリやトランザクションを同時に実行する必要があります。マルチスレッドを使用することで、複数のデータベースコネクションを同時に処理し、データベースへのアクセスを効率化することができます。
2.マルチスレッドのメリット
・並行処理の可能性
マルチスレッドのプログラムは、複数のスレッドが同時に実行されるため、複数のタスクを同時に処理できます。
・応答性の向上
マルチスレッドのプログラムは、複数のタスクが同時に実行されるため、応答性が向上し、ユーザーエクスペリエンスが向上します。
・スケーラビリティの向上
マルチスレッドのプログラムは、複数のコアを持つCPUを活用するため、処理能力を拡張し、スケーラビリティが向上します。
3.マルチスレッドのデメリット
複雑さとバグの可能性: マルチスレッドのプログラムは、複数のスレッドを管理する必要があるため、コードが複雑になり、バグが生じやすくなります。
・デッドロックや競合状態のリスク
マルチスレッドのプログラムでは、スレッド同士の競合状態やデッドロックなどの同期の問題が生じる可能性があります。
・リソースの消費
マルチスレッドのプログラムは、複数のスレッドを同時に実行するため、リソース(メモリ、CPU時間など)の消費が増加する場合があります。
以上がマルチスレッドの特徴と使用されている場面、メリット、デメリットになります。
6. まとめ
今回は、シングルスレッドとマルチスレッドについて特徴からメリット、デメリットまで述べてみました。実装は少し難しいかもしれませんが、どういった機能なのかは分かりやすいためこのタイミングで学習してみてはいかがでしょうか。