Ruby如何创建一个线程
2023-07-06
可以使用Thread.new方法去创建一个线程,可以随后代码块中列出线程执行的代码:
x = Thread.new sleep 0.1; print “x”; print “y”; print “z”
a = Thread.new print “a”; print “b”; sleep 0.2; print “c”
执行结果为:
ab
上面的示例程序中使用Thread.new创建了二个线程,线程随即开始运行。但是运行结果很奇怪,为什么程序运行结果是“ab”呢?我们预期的执行结果应该是 “abxyzc”。
当Ruby程序执行完毕的时候,他会杀掉所有的线程,不管其它的线程的运行状态如何。如果没有使用join方法,那么主程序执行完毕后会把所有没有执行完毕的线程杀掉。
上面的实例程序中,当主程序运行完毕时,两个线程都没有运行结束就被中止掉了。我们可以使用join方法来让主程序等待某个特定线程结束,对每一个线程使用join方法,可以确保在程序结束前所有的线程可以运行完毕。
x = Thread.new sleep 0.1; print “x”; print “y”; print “z”
a = Thread.new print “a”; print “b”; sleep 0.2; print “c”
x.join
a.join
我们使用Thread.new方法创建两个新的线程并开始运行, 然后使用join方法等待线程结束。执行结果为:
abxyzc
可以看到通过使用join方法等待线程结束,程序运行结果和我们预期结果相符。
另一个例子:
x = Thread.new sleep 0.1; print “x”; print “y”; print “z”
a = Thread.new sleep 0.1; print “a”; print “b”; sleep 0.2; print “c”
执行没有任何输出,因为主程序执行完毕杀死两个线程的时候这两个线程没有运行到输出语句。
也可以给join方法添加时间用来指明最大等待时间。如果超时join返回nil。
x = Thread.new sleep 0.1; print “x”; print “y”; print “z”
a = Thread.new sleep 0.1; print “a”; print “b”; sleep 10; print “c”
x.join(5)
a.join(5)
执行结果为:
abxyz
上面的例子中对于每一个线程的最大等待时间是5秒,由于a线程需要执行10秒以上,所以a线程没有运行完毕程序就将返回。