ruby - 如何获取值,谁先返回了其中一个线程
问题描述
我需要处理谁首先nil
从其中一个线程返回值并杀死其他线程。
例如我有这个代码:
需要“基准” a = 无 提出“我需要 1 秒钟的时间进行测试……” result_time = Benchmark.measure { 虽然是真的 t1 = Thread.new { a = nil 除非 a } 除非 t1 t2 = Thread.new { a = 1 除非 a; 睡眠 1 } 除非 t2 t3 = Thread.new { a = 1 除非 a; 睡眠 2 } 除非 t3 t1.join t2.join t3.join 如果!a.nil? t1.kill 如果 t1 t2.kill 如果 t2 t3.kill 如果 t3 休息 结尾 结尾 }。真实的 如果结果时间 >= 2.0 提出“糟糕。超过 1 秒。result_time: #{result_time}” 别的 “酷。不到 2 秒。” 结尾
此代码返回:
我需要 1 秒的时间进行测试... 坏的。超过 1 秒。结果时间:2.00074989994755所以我想要这个测试 1 秒(不是 2 秒)。请帮助并为我的英语感到抱歉:)
解决方案
我只是删除t1.join, t2.join and t3.join
...因为方法.join
停止主线程。但不知道为什么结果时间 >= 1 和 <=2。我认为睡眠指令没有被执行,因为主线程只是a = 1
在while
循环中杀死第二个而不等待睡眠指令。最终代码:
需要“基准” a = 无 提出“我需要 1 秒进行测试” result_time = Benchmark.measure { 虽然是真的 t1 = Thread.new { a = nil 除非 a } 除非 t1 t2 = Thread.new { a = 1 除非 a; 睡眠 1 } 除非 t2 t3 = Thread.new { a = 2 除非 a; 睡眠 2 } 除非 t3 如果!a.nil? t1.kill 如果 t1 t2.kill 如果 t2 t3.kill 如果 t3 休息 结尾 结尾 }。真实的还给我:如果结果时间 >= 2.0 提出“糟糕。超过 1 秒。result_time: #{result_time}。a: #{a}” 别的 puts "酷。不到 2 秒。result_time: #{result_time}。a: #{a}" 结尾
我需要 1 秒进行测试 凉爽的。不到2秒。结果时间:0.001799600024241954。一个:1
推荐阅读
- java - Javac 类路径/cp 选项找不到源文件
- javascript - 如何一次在“显示:flex”上只有 1 个 div
- javascript - 为什么背景图像中的图像是强奸?
- excel - 我需要帮助找到一个公式来格式化我的 Excel 数据库
- javascript - 如何使用 Leaflet.js 动态生成地图?
- objective-c - How to add uncompiled .mlmodel to Xcode UnitTests bundle
- maven - Jackson XML parsing MismatchedInputException
- python - 数据库内容未在 Django 中显示
- c# - ASP. Net Core integration tests
- python - 更改订阅日历中事件颜色时的 403 禁止响应