7

当我想在线程环境中引用当前线程时,几种策略似乎起作用:

  • t = Thread.new{p t}
  • Thread.new{|t| p t}
  • Thread.new{p Thread.current}
  • Thread.new{p self}

它们都是等价的吗?是否有理由在特定情况下选择一个而不是其他?

4

3 回答 3

5

self仅当您直接在传递给的块中调用它时才有效Thread.new,而不是从在该线程上运行的另一个类的方法内部调用它。如果您使用该Thread.new { |t| p t}方法,则必须t在该线程上运行的其他方法中使用它。但Thread.current无论您从哪里调用它都有效。

我会使用Thread.current,因为它让任何阅读代码的人都清楚你在做什么。有些读者可能不知道,如果Thread.new块接受一个参数,新线程将被传递给该参数。self也可能不是 100% 清楚。但任何读者都应该立即能够理解这Thread.current意味着什么。

于 2012-02-01T22:44:31.883 回答
2

简短的回答是:Thread.current是获取当前线程的最常用方法

于 2017-06-23T16:04:50.050 回答
0

除了亚历克斯的回答,我注意到t = Thread.new{p t}应该避免这种情况。在某些情况下,当子线程运行速度很快时,t主线程中的变量的赋值可能不会在子线程内部调用时完成,在这种情况下,t没有定义(返回nil)或者是别的东西。

于 2012-02-22T23:11:16.650 回答