我的线程忽略标志中断

时间:2012-09-08 17:52:32

标签: java android multithreading

嗨,我有一个简单的线程,我希望在标志中断打开时终止。 这是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”怎么可能?我只是打电话给中断

2 个答案:

答案 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块中放置breakreturn以立即退出该线程。但无论哪种方式,您都应该重新中断Thread,以便程序的其他部分可以检测到Thread上设置了中断条件。

有关详细信息,请参阅此问题/答案:

  

Why would you catch InterruptedException to call Thread.currentThread.interrupt()?