Tôi đang sử dụng một chuỗi liên tục đọc từ hàng đợi.Dừng chuỗi lặp trong Java
Cái gì như:
public void run() {
Object obj;
while(true) {
synchronized(objectsQueue) {
if(objectesQueue.isEmpty()) {
try {
objectesQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj = objectesQueue.poll();
}
}
// Do something with the Object obj
}
}
cách tốt nhất để ngăn chặn chủ đề này là gì?
tôi thấy hai lựa chọn:
1 - Kể từ Thread.stop()
bị phản đối, tôi có thể thực hiện một phương pháp stopThisThread()
có sử dụng một n nguyên tử biến kiểm tra điều kiện.
2 - Gửi đối tượng Sự kiện chết hoặc thứ gì đó tương tự như hàng đợi. Khi luồng tìm nạp một sự kiện tử vong, nó thoát ra.
Tôi thích cách thứ nhất, tuy nhiên, tôi không biết khi nào cần gọi phương thức stopThisThread()
, vì có thể trên đường đến hàng đợi và tín hiệu dừng có thể đến trước (không mong muốn).
Mọi đề xuất?
Lưu ý, 'wait' của bạn phải ở trong một 'while' vòng lặp, không phải là một' if', để bảo vệ chống lại wakeups giả mạo. –
Để tất cả những người phụ thuộc vào gián đoạn: Chỉ muốn nói rằng cuộc sống không bao giờ đơn giản và có lần khi một cuộc gọi bị gián đoạn trên một "hoạt động" không gián đoạn và hoạt động đó hoàn toàn không có thông báo về gián đoạn. Điều này từ kinh nghiệm. Mặc dù vậy, tôi không biết cách nào tốt hơn ... Hãy xem cẩn thận về API: http://java.sun.com/javase/6/docs/api/index.html?java/lang/Thread .html kiểm tra phương thức ngắt() – Yaneeve
@halfwarp: +1 và +1 cho câu trả lời của Stephen C. * "Sự kiện tử vong" * của bạn thực sự được gọi là * "thuốc độc" *: bạn chỉ đơn giản là enqueue một đối tượng đặc biệt (thuốc độc) có nghĩa là "ngăn chặn các chủ đề" một khi bạn dequeue nó. Bằng cách đó mọi thứ mà * "có thể đang trên đường đến hàng đợi" * [sic] vẫn được xử lý trước khi thuốc độc. – SyntaxT3rr0r