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

面试题 相关文章推荐
介绍一下Java的安全机制
Jun 28 面试题
SQL SERVER面试资料
Mar 30 面试题
.NET现在共支持多少种语言
Feb 26 面试题
STP的判定过程
Oct 01 面试题
Internet主要有哪些网络群组成
Dec 24 面试题
西安启天科技有限公司网络工程师面试题笔试题
Jun 12 面试题
C#面试常见问题
Feb 25 面试题
Windows和Linux动态库应用异同
Jul 28 面试题
sort命令的作用和用法
Aug 25 面试题
比较一下entity bean和session bean
Dec 27 面试题
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
Jun 22 面试题
Structs界面控制层技术
Oct 11 面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
J2EE中的容器都包括哪些
Aug 21 #面试题
J2EE面试题
Mar 14 #面试题
J2EE包括哪些技术
Nov 25 #面试题
You might like
DOMXML函数笔记
2006/10/09 PHP
个人站长制做网页常用的php代码
2007/03/03 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
在Python中处理时间之clock()方法的使用
2015/05/22 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python实现接口并发测试脚本
2019/06/25 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
Python Selenium库的基本使用教程
2021/01/04 Python
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
证婚人经典证婚词
2014/01/09 职场文书
房地产推广策划方案
2014/05/19 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
创新社会管理心得体会
2014/09/12 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
网络舆情信息简报
2015/07/21 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android