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

面试题 相关文章推荐
说出一些常用的类,包,接口
Sep 22 面试题
c/c++某大公司的两道笔试题
Feb 02 面试题
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
Jan 18 面试题
SQL里面如何插入自动增长序列号字段
Mar 29 面试题
一些.net面试题
Oct 06 面试题
木马的传播途径主要有哪些
Apr 08 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
Sep 18 面试题
什么是makefile? 如何编写makefile?
Aug 08 面试题
斯福泰克软件测试面试题
Feb 16 面试题
广州足迹信息技术有限公司Java软件工程师试题
Feb 15 面试题
瀑布模型都有哪些优缺点
Jun 23 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
Apr 24 面试题
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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
关于crontab的使用详解
2013/06/24 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
如何编写高质量JS代码
2014/12/28 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
JS实现滑动插件
2020/01/15 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
python操作MongoDB基础知识
2013/11/01 Python
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python3基础之基本数据类型概述
2014/08/13 Python
Python实现简单的代理服务器
2015/07/25 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
创业计划实施的7大步骤
2014/02/05 职场文书
社会公德演讲稿
2014/05/20 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
工作年限证明模板
2014/11/01 职场文书
入党政审材料范文
2014/12/24 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python