当我想在线程环境中引用当前线程时,几种策略似乎有效:
t = Thread.new{p t}
Thread.new{|t| p t}
Thread.new{p Thread.current}
Thread.new{p self}
它们都相同吗?是否有理由在特定背景下选择其中一个?
答案 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
是获取当前线程的最常用方法