java多线程之-----停止线程

在java中有以下三种方式可以终止正在运行的线程:
  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止线程,但是不推荐这个方法,因为stop和suspend以及resume一样,都是过期的方法,使用他么可能会产生不可预料的结果。
  3. 使用interrrut方法中断线程。

停止线程—异常法

新建Mythread类继承Thread

public class MyThread extends Thread{
     @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        //通过异常法来停止线程
        try {
            for(int i = 0;i<500000;i++)
            {
                System.out.println(i);
                if(this.interrupted()){         
                    System.out.println("已经停止了,我要退出");
                    throw new InterruptedException();
                }
            }
            System.out.println("如果没停止成功,就会运行我");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("停止");
            e.printStackTrace();
        }
    }
}

新建测试类


public class Test1 {
    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            myThread.sleep(1000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("main catch");
            e.printStackTrace();
        }

        System.out.println("finish");

    }
}

运行结果如图所示:

这里写图片描述

2在沉睡中停止

如果线程在沉睡中被停止的话会发生什么呢?
同样新建MyThread
public class MyThread extends Thread{
     @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        //通过异常法来停止线程
        try {
            System.out.println("开始运行");
            Thread.sleep(200000);
            System.out.println("结束运行");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("在沉睡中被停止"+this.isInterrupted());
            e.printStackTrace();
        }
    }
}

测试代码

public class Test1 {
    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            myThread.sleep(1000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("main catch");
            e.printStackTrace();
        }

        System.out.println("finish");

    }
}

运行结果:
这里写图片描述
从打印的结果可以看出,如果在sleep状态下停止某一个线程,会进去catch语句,并清楚停止状体,使之变成false。
前一个实验是先sleep再用interrpt()停止,与之相反的操作也要注意。下面的是先Interrpt()再调用sleep的测试:
新建MyThread类继承Thread:

package thread;

public class MyThread extends Thread{
     @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        //通过异常法来停止线程
        try {

            for(int i =0;i<100000;i++){
                System.out.println(i);
            }
            System.out.println("开始运行");
            Thread.sleep(200000);
            System.out.println("结束运行");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("先停止,再遇到sleep!进入catch");
            e.printStackTrace();
        }
    }
}

测试类:

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

        MyThread myThread = new MyThread();
        myThread.start();
        myThread.interrupt();

        System.out.println("finish");

    }
}

运行结果:
这里写图片描述

暴力停止线程

使用stop来停止线程是非常暴力的。
新建Mythread类:
package thread;

public class MyThread extends Thread{
    private int i = 0;
     @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        //通过异常法来停止线程
        try {
            while(true){
                i++;
                System.out.println("i="+i);
                Thread.sleep(1000);

            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

新建测试类:

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

        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(8000);
            myThread.stop();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}
下面的测试:
运行结果:
![这里写图片描述](https://img-blog.youkuaiyun.com/20171028162453304?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAwMzQ5MjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

方法stop()与java.lang.ThreadDeath异常

调用stop()方法会抛出java.lang.ThreadDeath异常,但在通常的情况下,该异常不需要显式的捕捉。
创建测试用的项目,文件MyThread的代码如下:
public class MyThread extends Thread {


    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        // 通过异常法来停止线程
        try {
            this.stop();
        } catch (ThreadDeath e) {
            // TODO Auto-generated catch block
            System.out.println("进入了catch方法");
            e.printStackTrace();
        }
    }
}
测试方法:

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

        MyThread myThread = new MyThread();
        myThread.start();

    }
}

运行结果:
这里写图片描述

使用return方法停止线程

将方法interrupt()与return 结合使用也能实现停止线程的效果。
创建线程测试用的项目,线程类MyThread代码如下:

public class MyThread extends Thread {


    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        // 通过异常法来停止线程
        while(true){
            if(this.isInterrupted()){
                System.out.println("停止了");
                return;
            }
            System.out.println("timer"+System.currentTimeMillis());

        }
    }
}

运行的代码:

public class Test1 {
    public static void main(String[] args) throws InterruptedException {

        MyThread myThread = new MyThread();
        myThread.start();
        Thread.sleep(2000);
        myThread.interrupt();;

    }
}

运行结果:
这里写图片描述
可以看到其成功的停止了线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值