2009-12-04 35 views
8

Tôi muốn giết các chủ đề bị kẹt trong trạng thái bế tắc. Trước tiên, chúng tôi có thể detect thread ids in deadlock state sử dụng phương pháp findDeadlockedThreads() của lớp ThreadMXBean trong java.lang.management.Làm thế nào để tiêu diệt các chuỗi bị khóa trong Java?

Sau đó, tôi muốn xóa các chủ đề theo id luồng và do đó tôi có hai câu hỏi liên quan:
(1) Làm cách nào để kiểm soát chuỗi theo id luồng?
(2) Làm thế nào để tiêu diệt một chủ đề bị chặn? Tôi nghĩ rằng invokting ngắt() phương pháp sẽ cung cấp cho một ngoại lệ cho thread và sẽ giết thread.

+3

Sửa mã để chủ đề không bế tắc ở nơi đầu tiên phải là những gì bạn đang cố gắng làm. – Chris

+0

Giống như Chris nói tôi nghĩ bạn nên lập kế hoạch để tránh deadlocks ngay từ đầu. – Alfred

+1

Cách an toàn duy nhất để thực hiện những gì bạn muốn là System.exit() ... và tôi chỉ nói đùa một phần. – PSpeed

Trả lời

3

Từ nhóm chủ đề gốc, bạn có thể có lớp Chủ đề enumerate all running threads. Sau đó, bạn có thể gọi Thread.stop trên một phù hợp với ID của bạn.

Có nói rằng, điều này là rất nguy hiểm do khả năng rời khỏi các đối tượng ở trạng thái không nhất quán. Tôi không tin rằng phương pháp gián đoạn sẽ khiến một chuỗi bị giải phóng bị kẹt trong khi chờ trên khóa đồng bộ hóa, vì vậy phương pháp dừng (ác)

Xem thêm: "Java Thread Primitive Deprecation".

+3

Độ xấu của điều này không thể được nhấn mạnh đủ. Tốt hơn để viết mã để tránh bế tắc ở nơi đầu tiên. – bmargulies

+0

Đếm tất cả các chuỗi đang chạy là một bài viết thú vị, vì vậy tôi chắc chắn sẽ sử dụng nó sau này. Cảm ơn. – Sangmin

+1

Cách tiếp cận Thread.stop() dường như không hoạt động trong Java 1.5. Các chủ đề bế tắc vẫn còn trong trạng thái BLOCKED. Đối với tôi, tôi đang cố gắng viết một bài kiểm tra đơn vị cho một máy dò bế tắc và tôi không thể loại bỏ các chủ đề cố ý bế tắc của tôi! :-) –

6

Phương thức java.util.concurrent.Lock.lockInterruptibly() bị gián đoạn, khóa đồng bộ hóa phổ biến hơn rất nhiều. Như đã đề cập trong tài liệu, khả năng liệt kê các chủ đề bế tắc được dự định như là một trợ giúp gỡ lỗi và không phải là một phương tiện để phục hồi trong môi trường sản xuất.

Trong quá trình sản xuất, có thể an toàn hơn để thoát toàn bộ quá trình và khởi động lại.

+1

+1 cho câu cuối cùng –

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