Java多线程(二)——线程中断interrupt

当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。

如下代码所示,线程中断了,仍继续执行

public class MyThreadDemo extends Thread{

    public static void main(String[] args){
        System.out.println("---线程准备中断----");
        Thread.currentThread().interrupt();
        System.out.println("---线程已经中断,仍然继续执行----");
    }

}

执行结果如下:

---线程准备中断----
---线程已经中断,仍然继续执行----

线程中断后,调用sleep()方法,会抛出InterruptedException异常

public class MyThreadDemo extends Thread{

    public static void main(String[] args){
        System.out.println("---线程准备中断----");
        Thread.currentThread().interrupt();

        try {
            Thread.currentThread().sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("---线程已经中断,仍然继续执行----");
    }

}

执行结果如下:

---线程准备中断----
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at examples.MyThreadDemo.main(MyThreadDemo.java:10)
---线程已经中断,仍然继续执行----

使用isInterrupted()方法判断中断状态

线程一旦被中断,isInterrupted()方法便会返回true,而一旦sleep()方法抛出异常,它将清空中断标志,此时isInterrupted()方法将返回false。

public class MyThreadDemo extends Thread{

    public static void main(String[] args){
        System.out.println("---线程准备中断----");
        Thread.currentThread().interrupt();

        System.out.println("---调用sleep()前,isInterrupted()值为:"+Thread.currentThread().isInterrupted());

        try {
            Thread.currentThread().sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("---调用sleep()后,isInterrupted()值为:"+Thread.currentThread().isInterrupted());

        System.out.println("---线程已经中断,仍然继续执行----");
    }

}

执行结果如下:

---线程准备中断----
---调用sleep()前,isInterrupted()值为:true
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at examples.MyThreadDemo.main(MyThreadDemo.java:12)
---调用sleep()后,isInterrupted()值为:false
---线程已经中断,仍然继续执行----

使用Thread.interrupted()方法判断中断状态

使用Thread.interrupted()方法来检查当前线程的中断状态,并且如果线程是中断的,线程将改为不中断。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。

public class MyThreadDemo extends Thread{

    public static void main(String[] args){
        System.out.println("---线程准备中断----");
        Thread.currentThread().interrupt();

        System.out.println("---Thread.interrupted()值为:"+Thread.interrupted());

        try {
            Thread.currentThread().sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("---Thread.interrupted()值为:"+Thread.interrupted());

    }

}

执行结果如下:

---线程准备中断----
---Thread.interrupted()值为:true
---Thread.interrupted()值为:false

join方法用线程对象调用,如果在一个线程A中调用另一个线程B的join方法,线程A将会等待线程B执行完毕后再执行。

yield可以直接用Thread类调用,yield让出CPU执行权给同等级的线程,如果没有相同级别的线程在等待CPU的执行权,则该线程继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值