嗨,我有一个简单的线程,我希望在标志中断打开时终止。 这是run run方法
的代码conn = false;
for (int i=0; (isInterrupted() == false) && (i < TRY_CONNECT) && !conn; i++) {
try{
Log.d(TAG,"TRY"+i);
sock.connect();
conn = true;
} catch (IOException e) {
try {
sleep(5000);
} catch (InterruptedException e1) {
Log.d(TAG,"CATCH int");
break;
}
}
}
if(isInterruped() == true)
Log.d(TAG,"INT");
我打电话给他的线程中断方法,它不会终止循环..他没有看到我打电话的中断......怎么可能? 对于调试:在我调用中断的地方我插入两个打印日志cat ... thread_reader.interrupt(); boolean b = thread_reader.isInterrupted(); Log.d(TAG “” + B);并且在log cat上系统打印“false”怎么可能?我只是打电话给中断
答案 0 :(得分:1)
当你抓住InterruptedException
时,只需打破循环。不要依赖于isInterrupted()
检查循环标头,因为在抛出InterruptedException
时清除了中断标志。
答案 1 :(得分:1)
每当你抓住InterruptedException
时,清除线程上的中断标志。每次执行捕获时,您都需要执行类似以下模式的操作:
try {
sleep(5000);
} catch (InterruptedException e1) {
Log.d(TAG,"CATCH int");
// _always_ re-interrupt the thread since the interrupt flag is cleared
Thread.currentThread().interrupt();
// you probably want to break
break;
}
正如@Alexei所提到的,您可以在catch块中放置break
或return
以立即退出该线程。但无论哪种方式,您都应该重新中断Thread
,以便程序的其他部分可以检测到Thread
上设置了中断条件。
有关详细信息,请参阅此问题/答案:
Why would you catch InterruptedException to call Thread.currentThread.interrupt()?