当我想在线程环境中引用当前线程时,几种策略似乎起作用:
t = Thread.new{p t}
Thread.new{|t| p t}
Thread.new{p Thread.current}
Thread.new{p self}
它们都是等价的吗?是否有理由在特定情况下选择一个而不是其他?
当我想在线程环境中引用当前线程时,几种策略似乎起作用:
t = Thread.new{p t}
Thread.new{|t| p t}
Thread.new{p Thread.current}
Thread.new{p self}
它们都是等价的吗?是否有理由在特定情况下选择一个而不是其他?
self
仅当您直接在传递给的块中调用它时才有效Thread.new
,而不是从在该线程上运行的另一个类的方法内部调用它。如果您使用该Thread.new { |t| p t}
方法,则必须t
在该线程上运行的其他方法中使用它。但Thread.current
无论您从哪里调用它都有效。
我会使用Thread.current
,因为它让任何阅读代码的人都清楚你在做什么。有些读者可能不知道,如果Thread.new
块接受一个参数,新线程将被传递给该参数。self
也可能不是 100% 清楚。但任何读者都应该立即能够理解这Thread.current
意味着什么。
简短的回答是:Thread.current
是获取当前线程的最常用方法
除了亚历克斯的回答,我注意到t = Thread.new{p t}
应该避免这种情况。在某些情况下,当子线程运行速度很快时,t
主线程中的变量的赋值可能不会在子线程内部调用时完成,在这种情况下,t
没有定义(返回nil
)或者是别的东西。