我有这段代码。 LinkedBlockingQueue
只有在等待添加到队列时被中断时才会抛出Exception
。但是这个队列是无限的,所以它应该尽快添加。为什么我的关机方法会抛出InterruptedException
?
private final LinkedBlockingQueue<Message> messages= new LinkedBlockingQueue<Message>();
public void run(){
LinkedList<Message> messages = new LinkedList<Message>();
while (true){
try{
messages.clear();
messages.add(this.messages.take());
this.messages.drainTo(messages);
for (Message message:messages){
if(message.isPoison())return;
doSomething(message);
}
}catch(Exception e){
getLogger().addException(e);
}
}
}
protected void add(Message m){
try {
messages.put(m);
}catch (InterruptedException e) {
getLogger().addException(e);
addRollback(e);
}
}
public void shutdown(){
try{
messages.put(MessageFactory.getPoison());
}catch(InterruptedException e){
//here an exception is thrown. Why?
}
}
答案 0 :(得分:2)
如果线程处于中断状态,即Thread.interrupted()== true,则调用将抛出InterruptionException
。它并不一定意味着线程在您put
时被中断,它可能在进入之前已处于该状态。