如何引用当前线程

时间:2012-02-01 22:26:49

标签: ruby multithreading ruby-1.9.3

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

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

它们都相同吗?是否有理由在特定背景下选择其中一个?

3 个答案:

答案 0 :(得分:3)

只有在传递给self的块中直接调用它时,

Thread.new才会起作用,而不是从在该线程上运行的另一个类的方法内调用它。如果您使用Thread.new { |t| p t}方法,如果要在该线程上运行的其他方法中使用它,则必须传递t。但Thread.current无论你在何处召唤它都会有效。

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

答案 1 :(得分:0)

除了Alex的回答,我注意到应该避免使用t = Thread.new{p t}。在某些情况下,当运行子线程很快时,主线程中变量t的赋值可能不会在子线程内调用时完成,在这种情况下,{{1未定义(返回t)或其他内容。

答案 2 :(得分:0)

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