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 23 面试题
serialVersionUID具有什么样的特征
Feb 20 面试题
大整数数相乘的问题
Jul 22 面试题
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
Apr 28 面试题
什么是Oracle的后台进程background processes?都有哪些后台进程?
Apr 26 面试题
三维科技面试题
Jul 27 面试题
C#中的验证控件有几种
Mar 08 面试题
一些Solaris面试题
Mar 22 面试题
linux面试题参考答案(10)
Oct 26 面试题
nohup的用法
Aug 10 面试题
为什么需要版本控制
Oct 28 面试题
几道Java和数据库的面试题
May 30 面试题
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的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
windows下python安装pip图文教程
2018/05/25 Python
Python多线程原理与用法详解
2018/08/20 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python如何调用字典的key
2020/05/25 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
高中自我鉴定范文
2013/11/03 职场文书
装修施工安全责任书
2014/07/24 职场文书
防灾减灾活动总结
2014/08/30 职场文书
安全生产协议书
2016/03/22 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
java executor包参数处理功能 
2022/02/15 Java/Android
配置nginx负载均衡
2022/05/06 Servers