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

面试题 相关文章推荐
什么是smarty? Smarty的优点是什么?
Aug 11 面试题
抽象方法、抽象类怎样声明
Oct 25 面试题
一套C++笔试题面试题
Jun 06 面试题
汇智创新科技发展有限公司
Dec 06 面试题
存储过程和函数的区别
May 28 面试题
一些网络技术方面的面试题
May 01 面试题
什么是规则表达式
May 03 面试题
如何拷贝一整个Java对象,包括它的状态
Dec 27 面试题
Java中的类包括什么内容?设计时要注意哪些方面
May 23 面试题
中软国际Java程序员机试题
Aug 19 面试题
Ejb技术面试题
Apr 29 面试题
如何现实servlet的单线程模式
Aug 05 面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
J2EE中的容器都包括哪些
Aug 21 #面试题
J2EE面试题
Mar 14 #面试题
J2EE包括哪些技术
Nov 25 #面试题
You might like
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
input file获得文件根目录简单实现
2013/04/26 PHP
php读取csc文件并输出
2015/05/21 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
JS实现页面打印功能
2017/03/16 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python爬虫中多线程的使用详解
2019/09/23 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
毕业生的自我评价分享
2013/12/18 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
教师网络培训心得体会
2016/01/09 职场文书