interrupted()方法和线程停止

今晚研究了一下多线程方面的书,有点心得,记录下来。
先来看一下interrupted()方法:判断当前线程是否为中断状态,执行后将状态标志清除为false。下面直接看代码:

public class InterruptThread extends Thread{
    @Override
    public void run(){
        super.run();
        for (int i=0; i < 5000; i++){
            System.out.println("i = " + (i+1));
        }   
    }
}

下面是运行的类

public class InterruptRun {
    public static void main(String[] args) {
        try {
            InterruptThread threadI = new InterruptThread();
            threadI.start();
            Thread.sleep(10);
            threadI.interrupt();
            Thread.currentThread().interrupt();
            System.out.println("main:" + Thread.currentThread().getName() + "是否停止1? = " + Thread.interrupted());
            System.out.println("main:" + Thread.currentThread().getName() + "是否停止2? = " + Thread.interrupted());
            System.out.println(threadI.getName() + "是否停止3? = " + threadI.isInterrupted());
            System.out.println(threadI.getName() + "是否停止4? = " + threadI.isInterrupted());
        }catch (InterruptedException e){
            System.out.println("main catch");
            e.printStackTrace();
        }
    }
}

结果:

...
i = 438
i = 439
main:main是否停止1? = true
main:main是否停止2? = false
Thread-0是否停止3? = true
Thread-0是否停止4? = true
i = 440
i = 441
...

结论:
1. 我们执行的是InterruptRun这个上的main函数,可以看到有一个main线程,main线程调用了另外一个线程Thread-0来执行线程类里的run方法。它们是并行执行的。
2. 我们使用了interrupt这个方法,然后也输出了Thread-0的中断标志位确实为true,然而run()中的循环还在跑直到结束,说明使用interrupt这个方法并不会让线程立即停下来。
3. mian线程中的标志位为什么会先为true,然后变成false呢?这就是前面说的interrupted()方法会将当前线程中的true置为false。

问题来了,如果我就是想让线程立即停止,需要怎么做?这时候可以加个判断,用抛出异常的方法来让线程停止。

public class InterruptThread extends Thread{
    @Override
    public void run(){
        super.run();
        try {
            for (int i=0; i < 5000; i++){
                if (this.isInterrupted()){
                    System.out.println("已经是停止状态了,我要退出");
                    throw new InterruptedException();
                }
                System.out.println("i = " + (i+1));
            }
        }catch (InterruptedException e){
            System.out.println("进入InterruptThread的catch块");
            e.printStackTrace();
        }
    }
}

这时候看结果:

i = 662
i = 663
main:main是否停止1? = true
已经是停止状态了,我要退出
main:main是否停止2? = false
进入InterruptThread的catch块
Thread-0是否停止3? = true
Thread-0是否停止4? = true
java.lang.InterruptedException
    at chapter01.InterruptThread.run(InterruptThread.java:14)

Thread-0线程就会立即停止,并且抛出InterruptedException异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值