2012-02-01 46 views
5

當我想引用一個線程的環境中當前線程,一些策略似乎工作:如何引用當前線程

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

它們都是否等同?是否有理由在特定環境下選擇其中一個?

+0

怪異的IM發現'self'犯規參考線:'Thread.new {P自我} .join'打印'main' – AJcodez 2013-04-15 06:52:12

回答

3

self只會在傳遞給Thread.new的塊內直接調用它,而不是如果您從該線程上運行的另一個類的方法內部調用它。如果您使用Thread.new { |t| p t}方法,則如果要在該線程上運行的其他方法中使用它,則必須通過t。但Thread.current的作品無論你從哪裏來。

我會使用Thread.current,因爲它明顯地告訴讀者如何閱讀代碼。有些讀者可能不知道,如果Thread.new塊接受一個參數,則新線程將被傳遞給該參數。 self也未必100%清晰。但任何讀者都應該立即明白Thread.current的含義。

0

除了Alex的回答,我注意到應該避免t = Thread.new{p t}。在某些情況下,當運行子線程速度較快時,在主線程中對變量t的分配可能不會在子線程內調用時完成,在這種情況下,未定義t(返回nil )還是別的。

0

簡短的回答是:Thread.current是最常用的方法來獲得當前線程