2012-08-10 16 views
7

Một số cách giải quyết nào khi xử lý thư viện của bên thứ ba không dọn sạch các chủ đề khi thư viện bị tắt?Làm thế nào để đối phó với các thư viện có hành vi xấu không dừng các chủ đề

Nhiều thư viện hiển thị các phương pháp vòng đời, hoặc rõ ràng hoặc ngầm, đối với mã chứa trong đó. Ví dụ, một khung ứng dụng web tồn tại trong một ngữ cảnh ứng dụng web trong một thùng chứa servlet. Khi bối cảnh được tạo ra, khuôn khổ có thể bắt đầu một số chủ đề, vì nhiều lý do khác nhau.

Bây giờ, lấy ví dụ thêm, khi thùng chứa servlet hoặc bối cảnh ứng dụng web bị tắt, khung ứng dụng web phải chấm dứt tất cả các chủ đề này. Hoặc là các thư viện ExecutorService do thư viện tạo ra phải tắt hoặc một số phương tiện khác để dừng các chủ đề đó sẽ được ban hành.

Trường hợp xấu nhất là chủ đề là non-daemon threads. Điều này thực sự sẽ ngừng việc chấm dứt tiến trình Java. Nhưng ngay cả khi họ là chủ đề daemon, cho phép chủ đề để tiếp tục có lẽ là thực hành xấu. Nếu (quay trở lại ví dụ), thùng chứa servlet được nhúng trong mã khác mà mã khác có thể tiếp tục chạy với các luồng vẫn còn chugging, điều này có thể gây ra vấn đề.

Không có cách nào có lập trình được tiếp xúc để ngăn chặn các chủ đề này, vậy bạn có thể làm gì?

Nếu bạn đang sử dụng thư viện của bên thứ ba như vậy, thì cách nào để buộc các chủ đề hiện có bị tắt?

Trả lời

5

Nếu bạn đang sử dụng thư viện của bên thứ ba như vậy, thì cách nào để buộc các chủ đề hiện có bị tắt?

Nói chung, không có cách nào an toàn để thực hiện việc này được đảm bảo hoạt động trong mọi trường hợp. Gần nhất bạn có thể nhận được một giải pháp an toàn là sử dụng ThreadGroup để liệt kê tất cả các Chủ đề hiện có và sử dụng Thread.interrupt() để yêu cầu mỗi chuỗi dừng lại. Tất nhiên, không có đảm bảo rằng các chủ đề sẽ chú ý, hoặc rằng họ sẽ tắt máy sạch để đáp ứng với một gián đoạn.

IMO, chiến lược tốt nhất là:

  • nếu đề không cần phải được tắt sạch, sau đó rút phích cắm trên JVM bằng cách gọi System.exit()

  • nếu các chủ đề cần phải được tắt sạch để tránh khả năng thiệt hại, sau đó không sử dụng thư viện ... hoặc tự khắc phục sự cố.

+3

+1 Bạn có thể chạy thư viện là một quá trình riêng biệt làm giảm tác động của việc giết quá trình. (Làm việc cho các thư viện JNI) –

+0

Cảm ơn @Stephen. Có, tất cả các chủ đề có thể được lấy ra, và ThreadGroups của họ, như mô tả ở đây: http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java. System.exit() chỉ hoạt động khi thư viện đã tạo các luồng được coi là mã 'lớp đầu tiên' cho quá trình đó. Sẽ không tốt nếu thư viện đơn giản * được sử dụng bởi * mã. –

+1

@Peter phụ thuộc vào thư viện tất nhiên ... chạy trong một quá trình riêng biệt sẽ làm cho giao tiếp khó khăn hơn. –

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