相信大家都很明白了,,,回顾一下
传统的程序是单线程的,程序的语句或指令顺序执行,直到程序中止。
多线程程序,顾名思义就是有多个执行线程。对于多 cpu 的机器而言,线程是并行执行的,而对于单 cpu 的机器,多线程其实是交替执行的。当然对每个线程内部而言,语句是顺序执行的。
创建一个新线程只需要给Thread.new
传递一个 block 即可。会创建一个新线程来执行 block 中的代码。而原线程会从Thread.new
返回并立即执行下一条语句。
# Thread #1 is running here
Thread.new {
# Thread #2 runs this code
}
# Thread #1 runs this code
下面是一个创建 ruby 多线程程序的例子:
#!/usr/bin/ruby
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}"
以上代码得到的结果如下:
Started At Wed May 14 08:21:54 -0700 2008
func1 at: Wed May 14 08:21:54 -0700 2008
func2 at: Wed May 14 08:21:54 -0700 2008
func2 at: Wed May 14 08:21:55 -0700 2008
func1 at: Wed May 14 08:21:56 -0700 2008
func2 at: Wed May 14 08:21:56 -0700 2008
func1 at: Wed May 14 08:21:58 -0700 2008
End at Wed May 14 08:22:00 -0700 2008
Thread.new
可以创建一个新线程,你也可以用同义词Thread.start
和Thread.fork
效果一样。
线程创建之后,你不用手动的去启动它,它会在 cpu 空闲的时候自动运行。
Thread 类定义了一些方法来查询和处理运行中的线程。具体参见 api.
传递给线程的 block 的最后一行的值就是整个线程的值,(说值不准确,这个地方应该说是线程的 value).你可以用线程对象的实例方法Thread#value
获得这个值。如果线程执行完成,Thread#value
会正常返回线程的值,否则,此方法会阻塞直到线程完成。
类方法Thread::current
返回当前线程对象。这个方法允许我们操控当前线程。Thread::main
返回 main 线程,它是 ruby 程序开始执行的初始线程。
通过调用线程实例的Thread#join
方法来等待线程的完成。调用线程会阻塞,直到给定线程完成。
如果主线程抛出一个异常,并没有处理,ruby 解释会抛出一个消息后退出。