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...

面试题 相关文章推荐
char型变量中能不能存贮一个中文汉字
Jul 08 面试题
c语言常见笔试题总结
Sep 05 面试题
写一个方法1000的阶乘
Nov 21 面试题
2019史上最全Database工程师题库
Dec 06 面试题
Ado与Ado.net的相同与不同
Dec 08 面试题
请解释在new与override的区别
Oct 29 面试题
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
Sep 06 面试题
Linux如何为某个操作添加别名
Feb 05 面试题
外企测试工程师面试题
Feb 01 面试题
百度JavaScript笔试题
Jan 15 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
Jun 20 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
Oct 12 面试题
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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
PHP数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
Use Word to Search for Files
2007/06/15 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
python自动下载图片的方法示例
2020/03/25 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
住宅质量保证书
2014/04/29 职场文书
运动会跳远广播稿
2015/08/19 职场文书