运行线程

这是对线程运行(thread-running)问题的简单修复。在代码的末尾,添加以下内容:

threads2.rb
  1. sleep( 5 )

现在,当你再次运行代码时,你应该会看到所有字符串和所有数字,尽管有点混乱。事实上,这正是我们想要的,因为它表明时间现在正在两个线程之间划分;这就是为什么单词和数字交错出现 - 首先第一个线程执行并显示一个单词,然后下一个线程执行并显示一个数字,然后执行返回到第一个线程,依此类推,直到第一个线程结束(当所有四个单词都显示后),此时第二个线程可以不间断地运行。

现在将其与该程序的第一个版本进行比较。在那个程序中我创建了两个线程,但是就像 Ruby 刚刚准备好运行它们包含的代码一样,迷惑(bam)!它到达了程序的末尾并关闭(中断)了所有事情 - 包括我的两个线程。所以,实际上,线程在它们有时间做任何事情之前都被杀掉了。

通过添加一个 sleep(5) 我给了 Ruby 五秒钟的延迟 - 在程序退出之前有足够的时间运行这些线程。这种技术只有一个问题 - 也是一个很大的问题。为让线程运行而向程序添加不必要的延迟会偏离练习的目的。这里的计时器显示的表明程序运行了整整五秒钟 - 比绝对必要的时间长约 4.99 秒!我们将很快看到更加优雅的处理线程的方法。

本地化?

目前(在 Ruby 1.8x 中)Ruby 的线程不是“原生的”(native)。简而言之,这意味着 Ruby 线程存在于 Ruby 程序的封闭世界中 - 多个线程在单个进程中分配时间(使用称为“时间切片”(time-slicing)的例程)。Ruby 没有利用操作系统处理的“本地线程”(native threads)的优势,以允许在一个或多个处理器上更有效地执行(使用“抢占式多任务处理”,pre-emptive multitasking)。虽然 Ruby 线程牺牲了效率,但它们至少可以从可移植性中获益;写在一个操作系统上的线程也将可以在不同的操作系统上运行。后续版本的 Ruby(在编写 Ruby 1.9 时,可能被视为主导 Ruby 2.0 的“实验性”版本)将支持本地线程。