Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > 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 節が実行されます。これはスレッドが正常に終了する時はもちろんですが、他のスレッドから Thread#kill などによって終了させられた時も同様に実行されます。
メインスレッドの終了時の詳細に関しては 終了処理 を参照して下さい。
個々のスレッドは、以下の実行状態を持ちます。これらの状態は Object#inspect や Thread#status によって見ることができます。
p Thread.new {sleep 1} # => #<Thread:0xa039de0 sleep>
生成されたばかりのスレッドや Thread#run や Thread#wakeup で起こされたスレッドはこの状態です。 Thread#join でスレッドの終了を待っているスレッドもスレッドの終了によりこの状態になります。 この状態のスレッドは「生きて」います。
Thread.stop や Thread#join により停止されたスレッドはこの状態になります。 この状態のスレッドは「生きて」います。
Thread#kill 等で終了されるスレッドは一時的にこの状態になります。この状態から停止状態(sleep)になることもあります。 この状態のスレッドはまだ「生きて」います。
Thread#kill 等で終了したスレッドはこの状態になります。この状態のスレッドはどこからも参照されていなければ GC によりメモリ上からなくなります。 この状態のスレッドは「死んで」います。
@todo
定義 | 説明 | |
---|---|---|
DEBUG -> Integer
|
スレッドのデバッグレベルを返します。 |
|
DEBUG=(val)
|
スレッドのデバッグレベルを val に設定します。 |
|
abort_on_exception -> bool
|
真の時は、いずれかのスレッドが例外によって終了した時に、インタプリタ全体を中断させます。false の場合、あるスレッドで起こった例外は、Thread#join などで検出されない限りそのスレッドだけをなにも警告を出さずに終了させます。 |
|
current -> Thread
|
現在実行中のスレッド(カレントスレッド)を返します。 |
|
exclusive { ... } -> object
|
VM グローバルの Mutex をロックし、ブロックを実行します。 |
|
exit -> ()
|
カレントスレッドに対して Thread#exit を呼びます。 |
|
start(*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
|
非同期割り込みのキューが空かどうかを返します。 |
|
stop -> nil
|
他のスレッドから Thread#run メソッドで再起動されるまで、カレントスレッドの実行を停止します。 |
定義 | 説明 | |
---|---|---|
self[name] -> object | nil
|
name に対応したスレッドに固有のデータを取り出します。 name に対応するスレッド固有データがなければ nil を返します。 |
|
self[name] = val
|
val を name に対応するスレッド固有のデータとして格納します。 |
|
abort_on_exception -> bool
|
真の場合、そのスレッドが例外によって終了した時に、インタプリタ全体を中断させます。false の場合、あるスレッドで起こった例外は、Thread#join などで検出されない限りそのスレッドだけをなにも警告を出さずに終了させます。 |
|
add_trace_func(pr) -> Proc
|
スレッドにトレース用ハンドラを追加します。 |
|
alive? -> bool
|
スレッドが「生きている」時、true を返します。 |
|
backtrace -> [String] | nil
|
スレッドの現在のバックトレースを返します。 |
|
backtrace_locations(start = 0, length = nil) -> [Thread::Backtrace::Location] | nil
|
スレッドの現在のバックトレースを Thread::Backtrace::Location の配列で返します。 |
|
exit -> self
|
スレッドの実行を終了させます。終了時に ensure 節が実行されます。 |
|
group -> ThreadGroup
|
スレッドが属している ThreadGroup オブジェクトを返します。 |
|
inspect -> String
|
自身を人間が読める形式に変換した文字列を返します。 |
|
join -> self
|
スレッド 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
|
スレッドの優先度を返します。この値が大きいほど優先度が高くなります。メインスレッドのデフォルト値は 0 です。新しく生成されたスレッドは親スレッドの priority を引き継ぎます。 |
|
raise(error_type, message, traceback) -> ()
|
自身が表すスレッドで強制的に例外を発生させます。 |
|
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オブジェクトです。 |
!
!=
__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