-2

嗨,伙计,我有一个简单的线程,我想在标志中断打开时终止。这是运行方法开头的代码

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(); 日志.d(标签,""+b); 在 log cat 上,系统打印“false”怎么可能?我刚刚调用了中断

4

2 回答 2

1

当你 catch 时InterruptedException,只需打破循环。不要依赖循环头中的检查,因为在抛出isInterrupted()时会清除中断标志。InterruptedException

于 2012-09-08T18:08:35.510 回答
1

每当你捕捉InterruptedException到它时,都会清除线程上的中断标志。当然,每次执行 catch 时,您都需要执行类似以下模式的操作:

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 块中放置一个breakorreturn以立即退出线程。但无论哪种方式,您都应该始终重新中断 ,Thread以便程序的其他部分可以检测到在Thread.

有关更多信息,请参阅此问题/答案:

为什么要捕获 InterruptedException 来调用 Thread.currentThread.interrupt()?

于 2012-09-08T18:36:21.893 回答