我在寫一個簡單的線程應用程序。線程只是一個消息消費者並對其進行處理。但是,如果線程以某種方式被打斷並且消息沒有完全處理,我想把它放回隊列並讓其他實例獲取它。因此,我不得不像這樣的代碼:在運行()的同步塊的中間是否可以中斷線程?
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