参考手册:标准库——内部类
admin
|
31#
admin 发表于 2007-06-06 13:25
用来表示Ruby的线程的类。
Thread使得并行编程成为可能。线程是一种共享内存空间并可同时运行的控制流。但由于目前Ruby解释器采用时间片轮转法来控制线程,所以使用线程后并不会提高程序的运行速度。 启动程序时生成的线程被称作主线程。若主线程因为某些原因而终止运行时,其他的所有线程和整个程序也会终止运行。若因为用户的干预而引发了某些异常时,它们会被送往主线程。 若启动线程时指定的块结束运行时,该线程也将终结。块的终结包括正常结束和因异常等引起的非正常结束两种情况。 Ruby的线程调度工作采用的是带优先顺序的循环复用法。每隔一段时间或运行中的某线程主动弃权时,就会进行调度。此时将从可运行的线程中挑选一个优先度最高的线程,并将context交给它。 线程和异常 若某线程内发生了异常,且没有被线程内的 rescue 捕捉到时,通常该线程会被停掉,而不会发出警告。但是,如果这时正好有其它线程因Thread#join而等待这个被停掉的线程时,则会在等待线程中再次引发相同的异常。 begin t = Thread.new do Thread.pass # 主线程确实是在等join raise "unhandled exception" end t.join rescue p $! # => "unhandled exception" end 另外,下列方法可以保证在某线程因发生异常而终止工作时,整个解释器就会被中断。 * 将内部变量$DEBUG的值设为真(调试模式)。另外,用-d选项来启动ruby解释器也可以取得相同的效果。 * 使用Thread.abort_on_exception来设置标识。 * 使用Thread#abort_on_exception来设定特定线程的标识。 若使用了上述3个方法之一的话,整个解释器就会被中断。 线程的状态 线程的运行状态如下。可以使用Object#inspect或Thread#status来查看线程的状态。 p Thread.new {sleep 1} # => #<Thread:0xa039de0 sleep> run (运行 or 可运行状态) 新生成的线程或那些被run以及wakeup方法唤醒的线程就是这种状态。有的线程会因为join而一直等待别的线程终止运行。而一旦这些线程终止运行,那些一直处于等待状态的线程也会变成这种状态。 处于该状态中的线程是“活”的。 sleep (挂起状态) 那些被Thread.stop 和 join 方法挂起的线程就是这种状态。 处于该状态中的线程是“活”的。 aborting (终止处理中) 那些被kill等扼杀的线程会暂时变为这种状态。有时还会从该状态变为挂起状态(stop)。 处于该状态中的线程仍然是“活”的。 dead (终止状态) 那些被kill等扼杀的线程就会变为这种状态。若处于该状态中的线程已经完全没用的话,就由GC将其清出内存。 处于该状态中的线程是“死”的。 超类: * Object 类方法: Thread.abort_on_exception Thread.abort_on_exception = newstate 若其值为真的话,一旦某线程因异常而终止时,整个解释器就会被中断。它的默认值是假,也就是说,在通常情况下,若某线程发生异常且该异常未被Thread#join等检测到时,该线程会被无警告地终止。详情请参考线程和异常。 它返回布尔值。在赋值形式中,它返回右边的newstate。 Thread.critical Thread.critical = newstate 当其值为真时,将不会进行线程切换。若当前线程挂起(stop)或有信号(signal)干预时,其值将自动变为false。 但是,当使用Thread.new生成新线程时,新线程将被执行。另外,还可以使用Thread.pass进行显式地切换。 它返回布尔值。在赋值形式中,它返回右边的newstate。 注意: 若涉及到I/O,GC或扩展库的问题时,该标识可能会被忽视.若想进行互斥操作的话,不要使用该方法,而应该使用Mutex或Monitor. Thread.current 返回当前运行中的线程(当前线程)。 Thread.exit 终止当前线程的运行。 返回当前线程。 若当前线程是唯一的一个线程时,将使用exit(0)来终止它的运行。 Thread.kill(thread) 终止指定线程的运行。若该线程已经终止,则不作任何动作。 返回thread。 Thread.list 返回处于运行状态或挂起状态的活线程的数组。 Thread.main 返回主线程。 Thread.new([arg, ...]) { ... } Thread.start([arg, ...]) { ... } Thread.fork([arg, ...]) { ... } 生成线程,并开始对块进行计算. 参数会被原封不动地传递给块. 这就可以在启动线程的同时,将值传递给该线程所固有的局部变量. 返回生成的线程. 例如,以下代码是错误的. 因为在线程开始运行之前, 变量i可能会被改写. for i in 1..5 Thread.start { p i } end 上面的代码应该改写为 for i in 1..5 Thread.start(i) {|t| p t } end Thread.pass 将运行权交给其他线程. 它不会改变运行中的线程的状态,而是将控制权交给其他可运行的线程(显式的线程调度). 返回nil. Thread.stop 将当前线程挂起,直到其他线程使用run方法再次唤醒该线程. 返回nil. 方法: self[name] 取出线程内与name相对应的固有数据. name可以是字符串或Symbol. 若没有与name相对应的数据时, 返回nil. self[name] = val 将线程内与name相对应的固有数据的值设为val。 name可以是字符串或Symbol. 若将val设为nil时, 将删除该线程内的对应数据. 返回val. abort_on_exception abort_on_exception = newstate 它返回布尔值。在赋值形式中,它返回右边的newstate。 若其值为真的话,一旦某线程因异常而终止时,整个解释器就会被中断。它的默认值是假.详情请参考线程和异常. alive? 若线程是"活"的,就返回true. 如果Thread#status返回真的话,该方法也返回真. exit kill terminate ((<ruby 1.7 特性>)) 终止线程的运行. 返回self. group ((<ruby 1.8 特性>)) 返回线程所属的ThreadGroup对象. p Thread.current.group == ThreadGroup:efault # => true 死线程返回 nil . join join(limit) ((<ruby 1.7 特性>)) 挂起当前线程,直到self线程终止运行为止. 若self因异常而终止时, 将会当前线程引发同样的异常. 返回self. ruby 1.7 特性: 若使用了limit参数的话, limit秒之后将会超时,并返回nil. 下例中,将等待所有新生成的线程终止运行. threads = [] threads.push(Thread.new { n = rand(5); sleep n; n }) threads.push(Thread.new { n = rand(5); sleep n; n }) threads.push(Thread.new { n = rand(5); sleep n; n }) threads.each {|t| t.join} key?(name) 若与name相对应的线程固有数据已经被定义的话,就返回true. name可以是字符串或Symbol. keys ((<ruby 1.7 特性>)) 以数组的形式返回与线程固有数据取得关联的索引. 它以Symbol的形式返回索引. th = Thread.current th[:foo] = 'FOO' th['bar'] = 'BAR' p th.keys #=> [:bar, :foo] priority 返回线程的优先度. 优先度的默认值为0. 该值越大则优先度越高. priority = val 设定线程的优先度. 也可以将其设定为负数. 返回val. raise([error_type,][message][,traceback]) 在该线程内强行引发异常. 请参考内部函数raise来了解各参数的细节. Thread.new { sleep 1 Thread.main.raise "foobar" } begin sleep rescue p $!, $@ end => #<RuntimeError: foobar> ["-:3"] run 重新启动被挂起(stop)的线程. 与Thread#wakeup不同的是,它将立即进行线程的切换. 若对死进程使用该方法时, 将引发ThreadError异常. 返回self. safe_level 返回self 的安全等级. 当前线程的safe_level与$SAFE相同. 请参考安全模型来详细了解安全等级的相关内容. status 使用字符串"run"、"sleep"或"aborting" 来表示活线程的状态. 若某线程是正常终止的话,就返回false. 若因异常而终止的话,就返回nil. 若Thread#alive?返回真的话,该方法也返回真. stop? 若线程处于终止状态(dead)或被挂起(stop)时,返回true. value 一直等到self线程终止运行(等同于join)后,返回该线程的块的返回值. 若在线程的运行过程中发生了异常, 就会再次引发该异常. 在下例中, 将会等待所有新生成的线程都终止运行后再输出结果. threads = [] threads.push(Thread.new { n = rand(5); sleep n; n }) threads.push(Thread.new { n = rand(5); sleep n; n }) threads.push(Thread.new { n = rand(5); sleep n; n }) threads.each {|t| p t.value} 若您觉得最后一行很难理解的话,可以写成这样. threads.each {|t| p t.join.value} wakeup 把被挂起(stop)的线程的状态改为可执行状态(run). 若对死线程执行该方法时,将会引发ThreadError异常. 返回self。 |