每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。
Ruby 中我们可以通过 Thread 类来创建多线程,Ruby 的线程是一个轻量级的,可以以高效的方式来实现并行的代码。
要启动一个新的线程,只需要调用 Thread.new 即可:
# 线程 #1 代码部分
Thread.new {
# 线程 #2 执行代码
}
# 线程 #1 执行代码
以下实例展示了如何在 Ruby 程序中使用多线程:
#!/usr/bin/ruby -w
# -*- coding : utf-8 -*-
puts "HaiCoder(www.haicoder.net)"
def func1
i=0
while i<=2
puts "func1 at: #{Time.now}"
sleep(2)
i=i+1
end
end
def func2
j=0
while j<=2
puts "func2 at: #{Time.now}"
sleep(1)
j=j+1
end
end
puts "Started At #{Time.now}"
t1=Thread.new{func1()}
t2=Thread.new{func2()}
t1.join
t2.join
puts "End at #{Time.now}"
以上代码执行结果为:
线程有 5 种状态:
线程状态 | 返回值 |
---|---|
可执行 | run |
睡眠 | Sleeping |
退出 | aborting |
正常终止 | false |
发生异常终止 | nil |
当某线程发生异常,且没有被 rescue 捕捉到时,该线程通常会被无警告地终止。但是,若有其它线程因为 Thread#join 的关系一直等待该线程的话,则等待的线程同样会被引发相同的异常。
begin
t = Thread.new do
Thread.pass # 主线程确实在等join
raise "unhandled exception"
end
t.join
rescue
p $! # => "unhandled exception"
end
使用下列 3 个方法,就可以让解释器在某个线程因异常而终止时中断运行。
当使用上述 3 种方法之一后,整个解释器就会被中断。
t = Thread.new { ... }
t.abort_on_exception = true