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中的Class类
Apr 10 面试题
大整数数相乘的问题
Jul 22 面试题
介绍一下SQL中union,intersect和minus
Apr 05 面试题
中海讯通笔试题
Sep 15 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
Jun 16 面试题
System.Array.CopyTo()和System.Array.Clone()有什么区别
Jun 20 面试题
简述DNS进行域名解析的过程
Dec 02 面试题
恒华伟业笔试面试题
Feb 26 面试题
Ajax和javascript的区别
Jul 20 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
Oct 22 面试题
介绍一下Ruby中的对象,属性和方法
Jul 11 面试题
德尔福集团DELPHI的笔试题
Feb 22 面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
J2EE中的容器都包括哪些
Aug 21 #面试题
J2EE面试题
Mar 14 #面试题
J2EE包括哪些技术
Nov 25 #面试题
You might like
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
google地图的路线实现代码
2009/08/20 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
javascript实现点击产生随机图形
2021/01/25 Javascript
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
python opencv摄像头的简单应用
2019/06/06 Python
python elasticsearch环境搭建详解
2019/09/02 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
机械专业毕业生推荐信范文
2013/11/25 职场文书
大学校庆策划书
2014/01/31 职场文书
导游词之吉林吉塔
2019/11/11 职场文书