Tôi có một lớp học lấy đối tượng từ một số BlockingQueue
và xử lý chúng bằng cách gọi số take()
trong vòng lặp liên tục. Tại một số điểm tôi biết rằng không có nhiều đối tượng sẽ được thêm vào hàng đợi. Tôi làm cách nào để gián đoạn phương thức take()
để nó dừng chặn?Làm thế nào để ngắt một BlockingQueue đang chặn trên take()?
Dưới đây là lớp mà xử lý các đối tượng:
public class MyObjHandler implements Runnable {
private final BlockingQueue<MyObj> queue;
public class MyObjHandler(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
MyObj obj = queue.take();
// process obj here
// ...
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Và đây là phương pháp sử dụng lớp này để xử lý các đối tượng:
public void testHandler() {
BlockingQueue<MyObj> queue = new ArrayBlockingQueue<MyObj>(100);
MyObjectHandler handler = new MyObjectHandler(queue);
new Thread(handler).start();
// get objects for handler to process
for (Iterator<MyObj> i = getMyObjIterator(); i.hasNext();) {
queue.put(i.next());
}
// what code should go here to tell the handler
// to stop waiting for more objects?
}
Phương pháp này còn được gọi là phương pháp 'Ngừng thuốc độc' và được thảo luận theo chiều dài trong "Thực hành đồng thời Java", cụ thể trên trang 155-156. –