我在写一个简单的线程应用程序。线程只是一个消息消费者并对其进行处理。但是,如果线程以某种方式被打断并且消息没有完全处理,我想把它放回队列并让其他实例获取它。因此,我不得不像这样的代码:在运行()的同步块的中间是否可以中断线程?
public void run()
{
Map<String, String> data = null;
try
{
while(true)
{
data = q.getData();
System.out.println(this+" Processing data: "+data);
// let others process some data :)
synchronized(this){
sendEmail(data);
data = null;
}
}
}
catch (InterruptedException e)
{
System.out.println(this+" thread is shuting down...");
if(null!=data)
q.add(data);
}
}
谢谢...
编辑:感谢您的答复。现在一切都很清楚。我明白,即使代码行在同步块中,如果它们中的任何一个都可以抛出InterruptedException,那么它只是意味着它们可以在此时被中断。 q.getData()行将此线程置于'阻塞'状态(我在q.getData()中使用LinkedBlockedQueue)。那时,这个线程可以被中断。
这是坏的...我做了一个快速测试,我可以在同步块中间中断线程......坏的不好...... – demotics2002 2011-02-28 08:09:27
为什么在这种情况下需要'synchronized'? – axtavt 2011-02-28 08:23:43
我想将sendMail()和设置为null为原子。 – demotics2002 2011-02-28 08:29:03