Java 我的线程忽略标志中断

Java 我的线程忽略标志中断,java,android,multithreading,Java,Android,Multithreading,嗨,伙计,我有一个简单的线程,我想在标志中断打开时终止它。 这是运行方法开始时的代码 conn = false; for (int i=0; (isInterrupted() == false) && (i < TRY_CONNECT) && !conn; i++) { try{ Log.d(TAG,"TRY"+i); sock.connect(); conn = true; } catch (

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

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");
conn=false;
对于(int i=0;(isInterrupted()==false)和(i
在线程外,我调用了中断方法,它不会终止循环。。他没有看到我所说的插话。。。怎么可能?
对于调试:在我调用中断的地方,我插入两个带有日志cat的打印。。。线程_reader.interrupt();布尔b=线程读取器isInterrupted();日志d(标签““+b”);而在日志cat上系统打印“假”怎么可能?我刚刚调用interrupt

当您捕获到
InterruptedException
时,只需中断循环即可。不要依赖于
isInterrupted()
检查循环头,因为当抛出
InterruptedException
时,中断标志将被清除。

每当捕获
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
,以立即退出线程。但是无论哪种方式,您都应该始终重新中断
线程
,以便程序的其他部分可以检测到在
线程
上设置了中断条件

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


如果我们甚至不知道这是什么编程语言,我们该如何帮助你呢?在我看来很像Java,所以我给它贴上了这样的标签。对不起,我的英语,我更好地解释了这个概念。。。如果我把中断放在cath中断异常中,只有当我中断线程时,它处于休眠状态,我才能解决问题。。。但如果不是睡眠,我的中断不会生成中断异常。。。线程应该在循环的头中看到标志。。。但没什么,为什么该标志在InterruptedException时被清除?是,如果现在使用break,则其正常。。。但是如果我调用中断时线程没有休眠循环看不到中断为什么?(isInterrupted()==false)看不到我的中断对不起我的英语我更好地解释了这个概念。。。如果我把中断放在cath中断异常中,只有当我中断线程时,它处于休眠状态,我才能解决问题。。。但如果不是睡眠,我的中断不会生成中断异常。。。线程应该在循环的头中看到标志。。。但没什么为什么?当它不睡觉时,它会检查isInterrupted(),它只返回中断状态,并且从不抛出异常。对不起,我的英语让我更好地解释了这个概念。。。如果我把中断放在cath中断异常中,只有当我中断线程时,它处于休眠状态,我才能解决问题。。。但如果不是睡眠,我的中断不会生成中断异常。。。线程应该在循环的头中看到标志。。。但是什么都没有为什么?你知道这一点,因为如果你放入一个
中断
并中断线程,它并不总是停止循环@dario?有没有可能您正在调用具有
sleep(…)
的其他代码或正在捕获
InterruptedException
的其他语句,并且没有重新中断线程?如果线程正在睡眠,我中断:系统抛出interrupt exception,我捕获它并中断循环,一切正常。。。但是如果当我中断时线程没有休眠,没有异常,但是线程应该将中断标志设置为true,但是当我在循环的头中测试它时,它是false。。。这就是问题所在!请帮助我:)在我调用中断的地方,我插入两个带有日志cat的打印。。。线程_reader.interrupt();布尔b=线程读取器isInterrupted();日志d(标签““+b”);而在日志cat上系统打印“假”怎么可能?如果线程捕获了
InterruptedException
,并且没有重新中断自身,那么调用interrupt是可能的。您是否在
中断异常的catch块中执行了
线程.currentThread().interrupt()