2012-02-01 31 views
5

Khi tôi muốn đề cập đến các chủ đề hiện tại trong môi trường của một chủ đề, một số chiến lược có vẻ làm việc:Làm thế nào để tham khảo các thread hiện hành

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

Tất cả chúng đều tương đương? Có một lý do để chọn một trong những người khác trong một bối cảnh cụ thể?

+0

im lạ tìm 'self' doesnt tham khảo các chủ đề: 'Thread.new {p} tự .join' in' main' – AJcodez

Trả lời

3

self sẽ chỉ hoạt động nếu bạn gọi trực tiếp trong khối được chuyển đến Thread.new, không phải nếu bạn gọi từ bên trong phương thức trên lớp khác chạy trên chuỗi đó. Nếu bạn sử dụng cách tiếp cận Thread.new { |t| p t}, bạn sẽ phải vượt qua t xung quanh nếu bạn muốn sử dụng nó bên trong các phương pháp khác đang chạy trên chuỗi đó. Nhưng Thread.current hoạt động bất kể bạn gọi từ đâu.

Tôi sẽ sử dụng Thread.current, bởi vì nó làm cho nó rõ ràng những gì bạn đang làm cho bất cứ ai đọc mã. Một số độc giả có thể không biết rằng nếu khối Thread.new có tham số, chuỗi mới sẽ được chuyển vào tham số đó. self có thể không rõ ràng 100%. Nhưng mọi độc giả nên ngay lập tức có thể hiểu được những gì Thread.current có nghĩa là.

0

Ngoài câu trả lời của Alex, tôi nhận thấy rằng t = Thread.new{p t} nên tránh. Trong một số trường hợp, khi chạy tiểu thread nhanh, việc gán cho biến t trong chủ đề chính có thể không được thực hiện vào thời điểm cuộc gọi của nó bên trong tiểu trình, trong trường hợp này, t không được xác định (trả lại nil) hoặc là cái gì khác.

0

Câu trả lời ngắn gọn là: Thread.current là phương pháp phổ biến nhất để có được thread hiện hành

Các vấn đề liên quan