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如何调用MYSQL存储过程
May 30 面试题
一份比较全的PHP面试题
Jul 29 面试题
几个人围成一圈的问题
Sep 26 面试题
写一个在SQL Server创建表的SQL语句
Mar 10 面试题
港湾网络笔试题
Apr 19 面试题
在weblogic中发布ejb需涉及到哪些配置文件
Jan 17 面试题
EJB3.1都有哪些改进
Nov 17 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
Nov 04 面试题
如果重写了对象的equals()方法,需要考虑什么
Nov 02 面试题
Java语言程序设计测试题改错题部分
Jul 22 面试题
程序员跳槽必看面试题总结
Jun 28 面试题
JSF的标签库有哪些
Apr 27 面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
J2EE中的容器都包括哪些
Aug 21 #面试题
J2EE面试题
Mar 14 #面试题
J2EE包括哪些技术
Nov 25 #面试题
You might like
Ajax PHP分页演示
2007/01/02 PHP
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
在Python的Django框架中加载模版的方法
2015/07/16 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
django的ORM模型的实现原理
2019/03/04 Python
pycharm新建一个python工程步骤
2019/07/16 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
python检测服务器端口代码实例
2019/08/31 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
jupyter实现重新加载模块
2020/04/16 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
五年级语文教学反思
2016/03/03 职场文书
python如何在word中存储本地图片
2021/04/07 Python
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
Python中super().__init__()测试以及理解
2021/12/06 Python