java以正确的方式停止线程

java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的。

大多数停止线程使用Thread.interrupt()方法,但是这个方法不会终止一个线程,还需要加入一个判断才可以完成线程的停止。

下面介绍一下常用停止线程应该使用的方法:

1、interrupt()

  Thread.interrupt()方法仅仅设置线程的状态位为中断线程,并不是让线程马上停止,中断线程之后会抛出interruptException异常。

2、Thread.interrupted()

  测试当前线程是否已经是中断状态,并且清楚状态。Boolean类型,中断返回true,反之false。当前线程指的是当前方法,并不是启动当前方法的线程。而清楚状态,则是指如果调用两次interrupted()方法,则第二次返回false。

3、Thread.isInterrupted()

  测试线程是否已经是是中断状态,但是不清除状态标志。

其实上面的开始我也不理解,经过多次思考,我用自己的话总结一下吧。

1、interrupt()方法仅仅将线程设置为中断状态,但是并不会去停止线程,返回true说明线程的中断状态已经被设置了。

2、

 

 

interrupt()、interrupted()和isInterrupted()的具体使用:

interrupt()、interrupted()使用:

 

public class Test01 extends Thread {

    @Override
    synchronized public void run() {
        super.run();
        for (int i = 0; i < 100000; i++) {
            //判断线程是否停止
            if (this.interrupted()){
                System.out.println("已经停止了");
                break;
            }
            System.out.println(i);
        }
        System.out.println("虽然线程已经停止了,但是还是会跳出for循环继续向下执行的");
    }

    public static void main(String[] args) {
        Test01 test = new Test01();
        try {
            test.start();
            test.sleep(50);
            //线程停止
            test.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println();

    }

}

 

 

 

打印结果:

3707
3708
3709
3710
3711

已经停止了
虽然线程已经停止了,但是还是会跳出for循环继续向下执行的

 

使用异常捕获法停止多线程:

当interrupted()检测到线程状态为停止的时候,会抛出异常,继而捕获这个异常来停止多线程

/**
 * 使用异常捕获法停止多线程
 */
public class Test01 extends Thread {

    @Override
    synchronized public void run() {
        super.run();
        try {
            for (int i = 0; i < 100000; i++) {
                //判断线程是否停止
                if (this.interrupted()) {
                    System.out.println("已经停止了");
                    //抛出异常
                    throw new InterruptedException();
                }
                System.out.println(i);
            }
        } catch (InterruptedException e) {
            System.out.println("线程结束...");
        }
    }

    public static void main(String[] args) {
        Test01 test = new Test01();
        try {
            test.start();
            test.sleep(100);
            test.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println();

    }

}

 打印语句:

8219
8220
8221
8222
8223
8224

已经停止了
线程结束...

 

posted @ 2018-08-24 13:17  测试5454  阅读(2293)  评论(1编辑  收藏  举报