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

面试题 相关文章推荐
如何强制垃圾回收
Oct 06 面试题
如何启动时不需输入用户名与密码
May 09 面试题
JAVA代码查错题
Oct 10 面试题
不开辟用于交换数据的临时空间,如何完成字符串的逆序
Dec 02 面试题
c++工程师面试问题
Aug 04 面试题
SQL Server提供的3种恢复模型都是什么? 有什么区别?
May 13 面试题
存储过程和sql语句的优缺点
Jul 02 面试题
TCP/IP模型的分界线
Dec 01 面试题
华三通信H3C面试题
May 15 面试题
介绍一下Java的事务处理
Dec 07 面试题
Java语言程序设计测试题改错题部分
Jul 22 面试题
精选干货:Java精选笔试题附答案
Jan 18 面试题
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执行速率优化技巧小结
2008/03/15 PHP
php array的学习笔记
2012/05/16 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
Python中私有属性的定义方式
2020/03/05 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
vue实现倒计时功能
2021/03/24 Vue.js
化工专业推荐信范文
2013/11/28 职场文书
高一自我鉴定
2013/12/17 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
毕业自我鉴定书
2014/03/24 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
股东合作协议书
2014/09/12 职场文书