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

class Thread

クラス・モジュールの継承リスト: Thread < Object < Kernel < BasicObject

要約

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

実装

ネイティブスレッドを用いて実装されていますが、現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時に実行されるネイティブスレッドは常にひとつです。ただし、IO 関連のブロックする可能性があるシステムコールを行う場合には GVL を解放します。その場合にはスレッドは同時に実行され得ます。また拡張ライブラリから GVL を操作できるので、複数のスレッドを同時に実行するような拡張ライブラリは作成可能です。

スケジューリング

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 などによって終了させられた時も同様に実行されます。

メインスレッドの終了時の詳細に関しては 終了処理 を参照して下さい。

スレッドの状態

個々のスレッドは、以下の実行状態を持ちます。これらの状態は 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 によりメモリ上からなくなります。 この状態のスレッドは「死んで」います。

デッドロックの検出

@todo

特異メソッド

定義 説明
DEBUG -> Integer

スレッドのデバッグレベルを返します。

DEBUG=(val)

スレッドのデバッグレベルを val に設定します。

abort_on_exception -> bool
abort_on_exception=(newstate)

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

current -> Thread

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

exclusive { ... } -> object

VM グローバルの Mutex をロックし、ブロックを実行します。

exit -> ()

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

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

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

handle_interrupt(hash) { ... } -> object

スレッドの割り込みのタイミングを引数で指定した内容に変更してブロックを実行します。

kill(thread) -> Thread

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

list -> [Thread]

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

main -> Thread

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

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

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

pass -> nil

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

pending_interrupt?(error = nil) -> bool

非同期割り込みのキューが空かどうかを返します。

report_on_exception -> bool
report_on_exception=(newstate)

真の時は、いずれかのスレッドが例外によって終了した時に、その内容を $stderr に報告します。

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 などで検出されない限りそのスレッドだけをなにも警告を出さずに終了させます。

add_trace_func(pr) -> Proc

スレッドにトレース用ハンドラを追加します。

alive? -> bool

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

backtrace -> [String] | nil

スレッドの現在のバックトレースを返します。

backtrace_locations(start = 0, length = nil) -> [Thread::Backtrace::Location] | nil
backtrace_locations(range) -> [Thread::Backtrace::Location] | nil

スレッドの現在のバックトレースを Thread::Backtrace::Location の配列で返します。

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

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

group -> ThreadGroup

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

inspect -> String

自身を人間が読める形式に変換した文字列を返します。

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

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

key?(name) -> bool

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

keys -> [Symbol]

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

name -> String

self の名前を返します。

name=(name) -> String

self の名前を name に設定します。

pending_interrupt?(error = nil) -> bool

self の非同期例外のキューが空かどうかを返します。

priority -> Integer
priority=(val)

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

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

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

report_on_exception -> bool
report_on_exception=(newstate)

真の場合、そのスレッドが例外によって終了した時に、その内容を $stderr に報告します。

run -> self

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

safe_level -> Integer

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

set_trace_func(pr) -> Proc | nil

スレッドにトレース用ハンドラを設定します。

status -> String | false | nil

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

stop? -> bool

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

thread_variable?(key) -> bool

引数 key で指定した名前のスレッドローカル変数が存在する場合に true、そうでない場合に false を返します。

thread_variable_get(key) -> object | nil

引数 key で指定した名前のスレッドローカル変数を返します。

thread_variable_set(key, value)

引数 key で指定した名前のスレッドローカル変数に引数 value をセットします。

value -> object

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

wakeup -> self

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

定数

定義 説明
MUTEX_FOR_THREAD_EXCLUSIVE -> Mutex

Thread.exclusive用のMutexオブジェクトです。 (private constant です。)

継承したメソッド

! != __id__ __send__ instance_eval instance_exec method_missing singleton_method_added singleton_method_removed singleton_method_undefined !~ <=> == === =~ _dump class clone define_singleton_method display enum_for eql? equal? extend freeze frozen? hash initialize initialize_copy instance_of? instance_variable_defined? instance_variable_get instance_variable_set instance_variables is_a? itself marshal_dump marshal_load method methods nil? object_id pretty_inspect pretty_print pretty_print_cycle pretty_print_inspect pretty_print_instance_variables private_methods protected_methods psych_to_yaml public_method public_methods public_send remove_instance_variable respond_to? respond_to_missing? send singleton_class singleton_method singleton_methods taint tainted? tap to_a to_ary to_hash to_int to_io to_proc to_regexp to_s to_str trust untaint untrust untrusted? .yaml_tag ::ARGF ::ARGV ::DATA ::ENV ::FALSE ::NIL ::RUBY_COPYRIGHT ::RUBY_DESCRIPTION ::RUBY_ENGINE ::RUBY_ENGINE_VERSION ::RUBY_PATCHLEVEL ::RUBY_PLATFORM ::RUBY_RELEASE_DATE ::RUBY_REVISION ::RUBY_VERSION ::SCRIPT_LINES__ ::STDERR ::STDIN ::STDOUT ::TOPLEVEL_BINDING ::TRUE