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

面试题 相关文章推荐
怎样在程序里获得一个空指针
Jan 24 面试题
.NET面试题:什么是反射
Sep 30 面试题
世界经理人咨询有限公司面试
Sep 23 面试题
能否解释一下XSS cookie盗窃是什么意思
Jun 02 面试题
C#公司笔试题
Mar 28 面试题
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
Jul 11 面试题
Linux面试经常问的文件系统操作命令
Oct 04 面试题
Linux如何修改文件和文件夹的权限
Sep 05 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
Dec 04 面试题
Python是如何进行类型转换的
Jun 09 面试题
MYSQL支持事务吗
Aug 09 面试题
Java如何读取CLOB字段
Oct 10 面试题
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 stripslashes和addslashes的区别
2014/02/03 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
javascript显示隐藏层比较不错的方法分析
2008/09/30 Javascript
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
jQuery实现图片加载完成后改变图片大小的方法
2016/03/29 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Scrapy的简单使用教程
2017/10/24 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
python中shell执行知识点
2020/05/06 Python
零基础小白多久能学会python
2020/06/22 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
英文简历中的自荐信范文
2013/12/14 职场文书
本科生自荐信
2014/06/18 职场文书
历史学专业求职信
2014/06/19 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
金秋助学感谢信
2015/01/21 职场文书
2016年母亲节广告语
2016/01/28 职场文书