Ruby ruby 中的 Thread

towonzhou · 2013年10月30日 · 最后由 crazyjin 回复于 2013年11月03日 · 5185 次阅读

相信大家都很明白了,,,回顾一下

ruby 多线程

传统的程序是单线程的,程序的语句或指令顺序执行,直到程序中止。
多线程程序,顾名思义就是有多个执行线程。对于多 cpu 的机器而言,线程是并行执行的,而对于单 cpu 的机器,多线程其实是交替执行的。当然对每个线程内部而言,语句是顺序执行的。

创建 ruby 线程

创建一个新线程只需要给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.startThread.fork效果一样。

线程创建之后,你不用手动的去启动它,它会在 cpu 空闲的时候自动运行。

Thread 类定义了一些方法来查询和处理运行中的线程。具体参见 api.

传递给线程的 block 的最后一行的值就是整个线程的值,(说值不准确,这个地方应该说是线程的 value).你可以用线程对象的实例方法Thread#value获得这个值。如果线程执行完成,Thread#value会正常返回线程的值,否则,此方法会阻塞直到线程完成。

类方法Thread::current返回当前线程对象。这个方法允许我们操控当前线程。Thread::main返回 main 线程,它是 ruby 程序开始执行的初始线程。

通过调用线程实例的Thread#join方法来等待线程的完成。调用线程会阻塞,直到给定线程完成。

线程和异常

如果主线程抛出一个异常,并没有处理,ruby 解释会抛出一个消息后退出。

先这样

貌似 ruby 不管你怎么 Thread.new 都只有一个系统级别的线程,Ruby 的线程是建立在系统线程之上的。。T T

#1 楼 @crazyjin 每次 Thread.new 都会创建一个系统线程。只是这些线程会竞争同一个锁。用 activity monitor 或者任务管理器看线程数就知道了

顶 1 个,待续 👍

ruby.exe 在 任务管理器里面的线程数是 100 多个,好多啊。

多线程都已经很传统了。。哈哈

#5 楼 @googya ....好吧,传统的传统

#1 楼 @crazyjin 看来功课做得还不够。。受教了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号