Tôi có một lớp lấy các đối tượng từ a BlockingQueue
và xử lý chúng bằng cách gọi take()
trong một vòng lặp liên tục. Tại một thời điểm nào đó, tôi biết rằng sẽ không có thêm đối tượng nào được thêm vào hàng đợi. Làm cách nào để ngắt take()
phương thức để nó ngừng chặn?
Đây là lớp 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 thức 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?
}