Trước tiên, tôi phải chỉ ra rằng ngăn chặn một sợi là KHÔNG dễ dàng. Trong thực tế, trong trường hợp chung, đề không thể dừng lại một cách an toàn:
Bạn có thể gọi Thread.interrupt()
trên một sợi mà bạn muốn dừng lại, nhưng không có gì bảo đảm rằng các chủ đề sẽ nhận thấy sự gián đoạn, hãy để một mình thực sự dừng lại.
Bạn có thể gọi phương thức Thread.stop()
không được chấp nhận, nhưng phương pháp này không an toàn. Nếu bạn gọi nó tại một thời điểm không may, bạn có thể để lại cấu trúc dữ liệu trong trạng thái được cập nhật một nửa, để lại các chủ đề khác chờ đợi (bao giờ hết) trên các tín hiệu sẽ không đến và vân vân.
Đây là cách tôi muốn thực hiện một cơ quan giám sát để thực hiện phương pháp.
Trước tiên tôi muốn sửa đổi phương thức để thêm hai lệnh gọi đến dịch vụ giám sát; ví dụ.
public void someMethod(...) {
Watchdog.startMethod(maxTime);
// do stuff
Watchdog.endMethod();
}
Tiếp theo, tôi muốn thực hiện Watchdog với một hàng đợi ưu tiên đặt hàng đúng thời hạn hết hạn:
- Các
startMethod(maxTime)
sẽ thêm một mục vào hàng đợi với thời gian hết hạn của now + maxTime
. Mục nhập sẽ bao gồm một tham chiếu đến chuỗi hiện tại (khi phương thức được gọi là
endMethod()
sẽ tìm mục nhập hàng đợi() cho chuỗi hiện tại và xóa nó nếu tìm thấy.
- Chủ đề bộ theo dõi định kỳ Nếu mục nhập đó có thời hạn ít hơn 'bây giờ', cơ quan giám sát sẽ loại bỏ mục nhập, dừng chủ đề của nó và kiểm tra mục nhập tiếp theo. Lặp lại cho đến khi mục nhập tiếp theo không hết hạn.
Một số suy nghĩ cần phải được cung cấp cho cấu trúc dữ liệu và để xử lý các trường hợp trong đó endMethod
cuộc gọi bị bỏ qua. (Trên thực tế, kể từ khi một cuộc gọi phương pháp có thể chấm dứt do một ngoại lệ, các cuộc gọi endMethod()
thực sự cần phải được thực hiện trong một khối finally
.)
Lưu ý rằng startMethod
và endMethod
cuộc gọi có thể (và có lẽ nên) được chèn vào bởi một chú thích bộ xử lý hoặc một cái gì đó như thế.
Do sự phức tạp, và thực tế là bạn không thể đảm bảo để ngăn chặn các chủ đề (an toàn), tôi muốn nghĩ về một số giải pháp mà không liên quan đến một cơ quan giám sát phương pháp.
Nguồn
2011-08-09 13:53:05
Có thể các khía cạnh sẽ làm gì? –
"Chủ đề dễ dừng", không, không phải. Tôi không hiểu "làm thế nào tôi có thể bảo đảm phương pháp bình thường của các đối tượng?", Không phải là ví dụ mà sau với vòng lặp vô tận. – toto2
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html Đọc tất cả điều đó và sau đó kiểm tra xem bạn vẫn muốn gọi dừng(). Có lẽ một số suy nghĩ bên ngoài của hộp ngôn ngữ là cần thiết để làm việc xung quanh vấn đề của bạn. – RichColours