Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Threadクラス

class Thread

クラスの継承リスト: Thread < Object < Kernel

要約

スレッドを表すクラスです。スレッドとはメモリ空間を共有して同時に実行される制御の流れです。 Thread を使うことで並行プログラミングが可能になります。

実装

Ruby のスレッドはユーザレベルで実装されており、 全プラットホーム上において同じ挙動を示します。 Ruby インタプリタは時分割でスレッドを実行しますので、 スレッドを使うことで実行速度が速くなることはありません。

スケジューリング

Ruby のスレッドスケジューリングは優先順位付のラウンドロビンです。一定 時間毎、あるいは実行中のスレッドが権利を放棄したタイミングでスケジュー リングが行われ、その時点で実行可能なスレッドのうち最も優先順位が高いも のにコンテキストが移ります。

メインスレッド

プログラムの開始と同時に生成されるスレッドを「メインスレッド」と呼 びます。なんらかの理由でメインスレッドが終了する時には、他の全てのスレッ ドもプログラム全体も終了します。ユーザからの割込みによって発生した例外 はメインスレッドに送られます。

スレッドの終了

スレッドの起動時に指定したブロックの実行が終了するとスレッドの実行も終 了します。ブロックの終了は正常な終了も例外などによる異常終了も含みます。

例外発生時のスレッドの振る舞い

あるスレッドで例外が発生し、そのスレッド内で rescue で捕捉されなかっ た場合、通常はそのスレッドだけがなにも警告なしに終了されます。ただ しその例外で終了するスレッドを Thread#join で待っている他の スレッドがある場合、その待っているスレッドに対して、同じ例外が再度 発生します。

begin
  t = Thread.new do
    Thread.pass    # メインスレッドが確実にjoinするように
    raise "unhandled exception"
  end
  t.join
rescue
  p $!  # => "unhandled exception"
end

また、以下の 3 つの方法により、いずれかのスレッドが例外によって終 了した時に、インタプリタ全体を中断させるように指定することができま す。

上記3つのいずれかが設定されていた場合、インタプリタ全体が中断されます。

スレッド終了時の ensure 節の実行

スレッド終了時には ensure 節が実行されます。 これはスレッドが正常に終了する時はもちろんですが、他のスレッドから Thread#kill などによって終了させられた時も同様に実行されます。 Thread#kill! が呼ばれた時はensure 節が実行されません。

ただしメインスレッドに対して Thread#kill! が呼ばれても ensure 節が実行されます。 メインスレッドの終了時の詳細に関しては 終了処理 を参照して下さい。

スレッドの状態

個々のスレッドは、以下の実行状態を持ちます。これらの状態は Object#inspectThread#status によって見ることができます。

p Thread.new {sleep 1} # => #<Thread:0xa039de0 sleep>
run (実行or実行可能状態)

生成されたばかりのスレッドや Thread#runThread#wakeup で起こされたスレッドはこの状態です。 Thread#join でスレッドの終了を待っているスレッドもスレッドの 終了によりこの状態になります。 この状態のスレッドは「生きて」います。

sleep (停止状態)

Thread.stopThread#join により停止されたスレッ ドはこの状態になります。 この状態のスレッドは「生きて」います。

aborting (終了処理中)

Thread#kill 等で終了されるスレッドは一時的にこの状態になりま す。この状態から停止状態(sleep)になることもあります。 この状態のスレッドはまだ「生きて」います。

dead (終了状態)

Thread#kill 等で終了したスレッドはこの状態になります。この状 態のスレッドはどこからも参照されていなければ GC によりメモリ上から なくなります。 この状態のスレッドは「死んで」います。

デッドロックの検出

ruby はデッドロックを検出します。デッドロックを検出した場合、例外 fatal が 発生してプロセスは終了します。デッドロックの条件は以下のとおりです。

メインスレッドだけが Thread.stop で停止している状態は sleep forever と同じと見なし、 fatal は発生しません。

特異メソッド

定義 説明
abort_on_exception -> bool
abort_on_exception=(newstate)

真の時は、いずれかのスレッドが例外によって終了した時に、インタプリタ 全体を中断させます。false の場合、あるスレッドで起こった例外は、Thread#join などで検出されない限りそのスレッドだけをなにも警告を出さずに終了させます。

critical -> bool
critical=(newstate)

真である間、スレッドの切替えを行いません。

current -> Thread

現在実行中のスレッド(カレントスレッド)を返します。

exit -> ()

カレントスレッドに対して Thread#exit を呼びます。

start(*arg) {|*arg| ... } -> Thread
fork(*arg) {|*arg| ... } -> Thread

スレッドを生成して、ブロックの評価を開始します。 生成したスレッドを返します。

kill(thread) -> Thread

指定したスレッド thread に対して Thread#exit を呼びます。終了したスレッドを返します。

list -> [Thread]

全ての生きているスレッドを含む配列を生成して返します。aborting 状態であるスレッド も要素に含まれます。

main -> Thread

メインスレッドを返します。

new(*arg) {|*arg| ... } -> Thread

スレッドを生成して、ブロックの評価を開始します。 生成したスレッドを返します。

pass -> nil

他のスレッドに実行権を譲ります。実行中のスレッドの状態を変えずに、 他の実行可能状態のスレッドに制御を移します。

stop -> nil

他のスレッドから Thread#run メソッドで再起動されるまで、カレ ントスレッドの実行を停止します。

インスタンスメソッド

定義 説明
self[name] -> object | nil

name に対応したスレッドに固有のデータを取り出します。 name に対応するスレッド固有データがなければ nil を返し ます。

self[name] = val

val を name に対応するスレッド固有のデータとして格納します。

abort_on_exception -> bool
abort_on_exception=(newstate)

真の場合、そのスレッドが例外によって終了した時に、インタプリタ 全体を中断させます。false の場合、あるスレッドで起こった例 外は、Thread#join などで検出されない限りそのスレッ ドだけをなにも警告を出さずに終了させます。

alive? -> bool

スレッドが「生きている」時、true を返します。

exit -> self
kill -> self
terminate -> self

スレッドの実行を終了させます。終了時に ensure 節が実行されます。

exit! -> self
kill! -> self
terminate! -> self

ensure 節を実行せずにスレッドの実行を終了させます。

group -> ThreadGroup | nil

スレッドが属している ThreadGroup オブジェクトを返します。 死んでいるスレッドは nil を返します。

join -> self
join(limit) -> self | nil

スレッド self の実行が終了するまで、カレントスレッドを停止し ます。self が例外により終了していれば、その例外がカレントス レッドに対して発生します。

key?(name) -> bool

name に対応したスレッドに固有のデータが定義されていれば true を返します。

keys -> [Symbol]

スレッド固有データに関連づけられたキーの配列を返します。キーは Symbol で返されます。

priority -> Integer
priority=(val)

スレッドの優先度を返します。この値の大きいほど優先度が高くなります。 メインスレッドのデフォルト値は 0 です。新しく生成されたスレッドは親スレッドの priority を引き継ぎます。

raise(error_type, message, traceback) -> ()

自身が表すスレッドで強制的に例外を発生させます。

run -> self

停止状態(stop)のスレッドを再開させます。 Thread#wakeup と異なりすぐにスレッドの切り替え を行います。

safe_level -> Integer

self のセーフレベルを返します。カレントスレッドの safe_level は、$SAFE と同じです。

status -> String | false | nil

生きているスレッドの状態を文字列 "run"、"sleep", "aborting" のいず れかで返します。正常終了したスレッドに対して false、例外によ り終了したスレッドに対して nil を返します。

stop? -> bool

スレッドが終了(dead)あるいは停止(stop)している時、true を返します。

value -> object

スレッド self が終了するまで待ち(Thread#join と同じ)、 そのスレッドのブロックが返した値を返します。スレッド実行中に例外が 発生した場合には、その例外を再発生させます。

wakeup -> self

停止状態(stop)のスレッドを実行可能状態(run)にします。

継承したメソッド

== === =~ __id__ __send__ _dump class clone dclone display enum_for eql? equal? extend freeze frozen? hash initialize initialize_copy inspect instance_eval instance_exec instance_of? instance_variable_defined? instance_variable_get instance_variable_set instance_variables is_a? marshal_dump marshal_load method method_missing methods nil? pretty_inspect pretty_print pretty_print_cycle pretty_print_inspect pretty_print_instance_variables private_methods protected_methods public_methods remove_instance_variable respond_to? singleton_method_added singleton_method_removed singleton_method_undefined singleton_methods taint tainted? tap to_a to_ary to_hash to_int to_io to_proc to_regexp to_s to_str to_yaml to_yaml_properties to_yaml_style untaint

追加されるメソッド

定義 説明 ライブラリ
exclusive { ... }

ブロック実行中、Threadの切り替えを行いません。

thread