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?
+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) –
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ã. –
@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. –