Khi một bế tắc xảy ra tôi muốn ngắt thread chặn ...
Bạn thể thực hiện một công việc định kỳ để kiểm tra sự bế tắc (nơi deadlocks là java nội tại hoặc Lock
dựa) và cuộc gọi interrupt
trên tất cả các chủ đề liên quan đến kịch bản. Tuy nhiên, điều này không đảm bảo rằng nó sẽ giải quyết vấn đề của bạn. Có khả năng kịch bản đó sẽ lại xảy ra. Xem Dr Heinz's article on a deadlock detector để biết chi tiết.
Nếu thực tế, không có đảm bảo rằng interrupt
thậm chí sẽ giải phóng một quy trình bị chặn như thế này. Cách tiếp cận tốt hơn nhiều của nó để tránh tình huống bế tắc ở nơi đầu tiên bằng cách sử dụng các khóa có thời gian chờ và thử lại các chiến lược hoặc phương pháp 'thử trước khi bạn mua'.
và tôi muốn ghi lại những ngăn xếp dấu vết của chủ đề này ...
Nếu bạn muốn làm điều này programatically, một lần nữa, hãy làm theo ví dụ Tiến sĩ Heinz. Nếu không, chỉ cần tạo kết xuất chuỗi khi bạn đã phát hiện sự cố.
Có cách nào để chúng tôi có thể tìm ra dấu vết ngăn xếp của một chuỗi bên ngoài chuỗi đó trong Java không?
Có và không. Bạn có thể đổ các chủ đề từ các máy ảo khác nhưng dấu vết ngăn xếp của chúng có thể không hữu ích như bạn nghĩ để xác định nguyên nhân gây ra bế tắc của bạn. Nếu một bế tắc chính hãng đã được phát hiện (bởi chính JVM trên kết xuất chuỗi máy ảo ứng dụng của bạn), bạn nên có mọi thứ bạn cần để gỡ lỗi nguyên nhân (nhiều hơn hoặc ít hơn).
Bạn có nghĩa là bạn muốn phát hiện bế tắc và khôi phục? Không bao giờ làm điều đó, nhưng bằng cách sử dụng một dấu vết ngăn xếp cho rằng không âm thanh như đúng cách để tôi .. –
Tôi cần theo dõi ngăn xếp để tôi biết nơi mà các chủ đề bị mắc kẹt và có thể khắc phục vấn đề để ứng dụng hoạt động ngay sau khi khởi động lại. Tuy nhiên tôi muốn ngắt chuỗi chặn để ứng dụng hoạt động cho đến khi tôi tìm thấy một số thời gian để khắc phục sự cố và giải phóng nó. – Palo