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

面试题 相关文章推荐
mysql的最长数据库名,表名,字段名可以是多长
Apr 21 面试题
你常见到的runtime exception
Sep 05 面试题
怎样声明子类
Jul 02 面试题
C语言中一个结构不能包含指向自己的指针吗
May 25 面试题
C语言中break与continue的区别
Jul 12 面试题
编码实现字符串转整型的函数
Jun 02 面试题
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
Jul 27 面试题
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
Jan 13 面试题
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
Feb 16 面试题
Jdbc数据访问技术面试题
Mar 30 面试题
史上最全面的Java面试题汇总!
Feb 03 面试题
Java servlet面试题
Mar 04 面试题
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把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
蔬菜基地的创业计划书
2014/01/06 职场文书
《问银河》教学反思
2014/02/19 职场文书
学前班评语大全
2014/05/04 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle