Thỉnh thoảng chúng ta buộc phải dừng một luồng như một nỗ lực tốt nhất trước khi tắt hoàn toàn toàn bộ JVM. Thông thường, Thread#stop
được trích dẫn như là một cảnh báo chắc chắn, ngay cả khi bị cản trở và không dùng nữa, cách vô điều kiện dừng một luồng. Đây không phải là như vậy, tuy nhiên: tất cả các chủ đề giả mạo có phải làm gì để giữ cho bản thân chạy là bắt ThreadDeath
hoặc một lớp cha:Làm thế nào để dừng vô điều kiện một sợi
public static void main(String[] args) throws InterruptedException {
final Thread t = new Thread() { public void run() {
for (;;)
try { Thread.sleep(Long.MAX_VALUE); }
catch (Throwable t) {
System.out.println(t.getClass().getSimpleName() + ". Still going on...");
}
}};
t.start();
Thread.sleep(200);
t.interrupt();
Thread.sleep(200);
t.interrupt();
Thread.sleep(200);
t.stop();
Thread.sleep(200);
t.stop();
}
này sẽ in
InterruptedException. Still going on...
InterruptedException. Still going on...
ThreadDeath. Still going on...
ThreadDeath. Still going on...
Có điều gì khác mà tôi có thể làm để thực sự, thực sự ngăn chặn một chủ đề mà không giết chết toàn bộ JVM?
Tôi biết nó không trả lời câu hỏi [nhưng đây là một đọc tốt về chủ đề] (http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation. html), nó giải thích lý do tại sao dừng lại không được chấp nhận ở nơi đầu tiên. Ngoài ra, tại sao bạn sẽ có một 'rouge thread' có thể bắt được TheadDeath và bị gián đoạn ngay từ đầu? Chủ đề không có nghĩa là cho điều đó. Họ không cung cấp bảo mật. Các chủ đề khác cũng có thể chấm dứt chính JVM - hoặc sinh ra các luồng có vấn đề khác. –
Đây có lẽ là một câu hỏi học thuật; Tôi chỉ muốn biết chính xác những gì từng kỹ thuật dừng lại và những kỹ thuật nào có ở nơi đầu tiên. Như một nhu cầu cụ thể thể hiện bản thân, loại kiến thức này là những gì có thể giúp bạn tiết kiệm. –
@BenjaminGruenbaum Tôi khuyên bạn nên gửi một câu trả lời đơn giản là "không": không có cách nào để thực sự, _really_ (buộc) dừng một chuỗi mà không giết toàn bộ JVM, và sau đó liên kết đến bài viết đó. –