Threads

Revised: Mar./23rd/2002

スレッドとは、逐次的な制御フローのことです。

通常のプログラムのプロセスは開始/処理/終了の流れを持つ逐次制御フローです。一つのコンピュータ上では、複数のプログラムが実行されていることが普通です。背後ではシステム管理用に大量のプログラムが実行されており、表側でも MS Word, Excel, I.E., Notes などなどのプログラムが実行されています。これらのプログラムを、メモリに読み込み、CPU 時間を割り当てるのは OS の仕事です。OS から見て、コンピュータ資源の割り当て単位をプロセス(タスク)と呼びます。通常のコンピュータは、同時に複数のプロセスを実行可能な、マルチ・プロセスの仕組みを持っています。

プロセス内の制御フローのことをスレッドと呼びます。プロセス内で制御フローが一つしか実行されていないものをシングル・スレッドと呼び、複数のスレッドが存在する場合をマルチ・スレッドと呼びます。プロセス内の複数のスレッドは、コンピュータがそのプロセスに割り当てた資源を共有して、各々が独立した制御フローを実行できます。

制御フローを一本の糸に見立てると、複数の糸を一直線につなぎ合わせたものがシングルスレッド・プログラムであり、平行に並べたものがマルチスレッド・プログラムです。平行に並べた場合は、一つの糸の長さが伸びるのですが、一直線につなげた場合よりも全体の長さは短くなります。実用プログラムでは、マルチスレッドでないものはないといって過言ではありません。

Java では、言語仕様によって、マルチスレッドがサポートされています。つまり、一つの Java プログラムが複数のスレッドを持つことが可能であり、そのプロセス内のスレッドに対する資源管理を実行してくれます。

他の言語でも、マルチ・スレッドを使うことができますが、資源割り当てなどを自分で実装する必要があり、非常に高度なスキルを要求しますし、ローカルのコンピュータに依存する処理をたくさん実装する必要があるので、移植時の変更コストも莫大になります。Java では、そのような機能は、全て JVM が提供するので、プログラマはアプリケーション要件のビジネス・ロジックを実装することに集中できます。また、ポータビリティ(可搬性)も確保されます。

main() メソッドは一つのスレッドを発生させます。本稿で今まで開発し、実行していたアプリケーションは、全てシングルスレッドのサンプルと言えます。尤も、標準クラスライブラリの中には、背後で複数のスレッドを発生させて実行するものもあるのですが、本節では、プログラムの中で明示的に複数のスレッドを同時に実行する、マルチスレッド・プログラムの開発方法を紹介します。



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.