关于Java线程的isInterrupted方法问题 3C

我调用interrupt方法中断线程后,isInterrupted仍然为false。看代码第二个注释处

 public class InterruptThread
{
    public static void main(String[] args) {

        Mythread mythread= new Mythread();
        mythread.start();
        try {
            Thread.sleep(10000);//主线程休眠十秒,让子线程执行十秒,然后中断mythread子线程
            mythread.interrupt();
            Thread.sleep(3000);
            //明明调用了mythread.interrupt(),下面这句却还是false,这是为何?
            System.out.println("线程是否已经中断:"+mythread.isInterrupted());
            System.out.println("线程是否已经中断:"+mythread.interrupted());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Mythread extends Thread{
    @Override
    public void run(){
        try {
            while(true){
                interruptableMethod();
            }
        } 
        catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName()+"线程中断了");
        }
    }

    public void interruptableMethod() throws InterruptedException{
        System.out.println("方法开始执行");
        sleep(2000);
        System.out.println("方法结束");
    }
}

3个回答

interrupt
public void interrupt()中断线程。
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。

如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。

如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。

如果以前的条件都没有保存,则该线程的中断状态将被设置。

中断一个不处于活动状态的线程不需要任何作用。

抛出:
SecurityException - 如果当前线程无法修改该线程

interrupt不一样能成功,而且thread目前也不建议,最好在线程中加入volatile变量来控制关闭,最次可以使用wait方法。

其实join也不错的,当前线程执行完,再执行原线程。考虑下你的应用场景 吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问