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

面试题 相关文章推荐
几道PHP的面试题
May 19 面试题
你常见到的runtime exception
Sep 05 面试题
JRE、JDK、JVM之间的关系怎样
May 16 面试题
一份Java笔试题
Feb 21 面试题
VC++笔试题
Oct 13 面试题
strstr()的简单实现
Sep 26 面试题
new修饰符是起什么作用
Jun 28 面试题
linux下进程间通信的方式
Dec 23 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
Sep 07 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
Mar 30 面试题
深圳茁壮笔试题
May 28 面试题
信号量和自旋锁的区别?如何选择使用?
Sep 08 面试题
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 swfupload图片上传的实例代码
2013/09/30 PHP
php中file_exists函数使用详解
2015/05/08 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
PHP实现递归的三种方法
2020/07/04 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
Numpy掩码式数组详解
2018/04/17 Python
Python高斯消除矩阵
2019/01/02 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
致跳高运动员广播稿
2014/01/13 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
临床专业自荐信
2014/06/22 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
中秋节寄语2015
2015/03/24 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技