我正在使用一个不断从队列中读取的线程。
类似这样:
类似这样:
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
}
}
如何停止该线程?
我看到有两个选项:
1 - 由于Thread.stop()
已被弃用,我可以实现一个stopThisThread()
方法,使用原子检查条件变量。
2 - 向队列发送死亡事件对象或类似的东西。当线程获取死亡事件时,它将退出。
我更喜欢第一种方式,但我不知道何时调用stopThisThread()
方法,因为可能有一些内容正在前往队列,而停止信号可能会先到达(这是不可取的)。
有什么建议吗?
wait
应该在一个while
循环中,而不是在if
语句中,以防止虚假唤醒。 - Tom Hawtin - tacklineisInterrupted()
。但这并不意味着使用它是错误和/或不可能的。事实上,这是唯一的方法来告诉一个正在阻塞I/O调用的线程检查某些条件。 - Joachim Sauer