Tôi đang cố gắng hiểu cách các luồng hoạt động trong Java và hiện đang điều tra cách thực hiện các chuỗi lặp có thể bị hủy bỏ. Dưới đây là các mã:Làm gián đoạn các chuỗi được lặp trong Java
public static void main(String[] args) throws Exception {
Thread t = new Thread() {
@Override
public void run() {
System.out.println("THREAD: started");
try {
while(!isInterrupted()) {
System.out.printf("THREAD: working...\n");
Thread.sleep(100);
}
} catch(InterruptedException e) {
// we're interrupted on Thread.sleep(), ok
// EDIT
interrupt();
} finally {
// we've either finished normally
// or got an InterruptedException on call to Thread.sleep()
// or finished because of isInterrupted() flag
// clean-up and we're done
System.out.println("THREAD: done");
}
}
};
t.start();
Thread.sleep(500);
System.out.println("CALLER: asking to stop");
t.interrupt();
t.join();
System.out.println("CALLER: thread finished");
}
Các chủ đề tôi tạo là indended bị gián đoạn sớm hay muộn. Vì vậy, tôi kiểm tra cờ isInterrupted() để quyết định xem tôi có cần tiếp tục và bắt InterruptedException
để xử lý các trường hợp khi tôi đang hoạt động chờ (sleep
, join
, wait
).
Những điều tôi muốn làm rõ là:
- Có tốt để sử dụng cơ chế gián đoạn cho các loại hình công việc? (so sánh với việc có
volatile boolean shouldStop
) - Giải pháp này có đúng không?
- Tôi có nuốt InterruptedException bình thường không? Tôi không thực sự quan tâm đến đoạn mã mà ai đó đã yêu cầu sợi của tôi bị gián đoạn.
- Có cách nào ngắn hơn để giải quyết vấn đề này không? (Điểm chính là có vòng lặp 'vô hạn')
EDIT gia tăng cuộc gọi đến interrupt()
trong đánh bắt cho InterruptedException
.
OK, nhưng không nên mở rộng Chủ đề vì không mở rộng chức năng của nó. Thực hiện một Runnable được sử dụng bởi một Thread chuẩn. –