Ruby如何创建一个线程


Posted in 面试题 onMarch 10, 2013
可以使用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线程没有运行完毕程序就将返回。

Tags in this post...

面试题 相关文章推荐
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
Jul 30 面试题
一套带答案的C++笔试题
Jan 10 面试题
struct和class的区别
Nov 20 面试题
经典c++面试题五
Dec 17 面试题
数据库笔试题
May 09 面试题
.NET程序员的几道面试题
Jun 01 面试题
.NET现在共支持多少种语言
Feb 26 面试题
什么情况下你必须要把一个类定义为abstract的
Jan 06 面试题
什么是makefile? 如何编写makefile?
Aug 08 面试题
一套软件测试笔试题
Jul 25 面试题
一份软件工程师的面试试题
Feb 01 面试题
下面代码从性能上考虑,有什么问题
Apr 03 面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
J2EE中的容器都包括哪些
Aug 21 #面试题
J2EE面试题
Mar 14 #面试题
J2EE包括哪些技术
Nov 25 #面试题
You might like
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
激活 ActiveX 控件
2006/10/09 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python flask搭建web应用教程
2019/11/19 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python离线安装外部依赖包的实现
2020/02/13 Python
详解Python IO编程
2020/07/24 Python
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
strlen的几种不同实现方法
2013/05/31 面试题
会计学自我鉴定
2014/02/06 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
校庆活动策划方案
2014/06/05 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
爱国影片观后感
2015/06/18 职场文书
全民创业工作总结
2015/08/13 职场文书
安全生产标语口号
2015/12/26 职场文书
学习计划是什么
2019/04/30 职场文书