停止线程的三种方法

在Java中有以下3种方法可以终止正在运行的线程:
1. 抛异常法;
2. 使用stop方法强行终止线程
3. 使用interrupt方法中断线程
下面分别对它们进行介绍:
一、抛异常法
抛异常法:顾名思义就是通过抛出一个异常,然后再捕获异常,从而跳过后面要继续执行的语句,达到终止线程的目的。使用抛异常法首先要判断该线程是否是停止状态,只有是停止状态才抛异常。
下面是具体示例:

package com.vhqimk.thread;

/*
 * 测试通过抛异常终止线程的情况
 */
public class Test {
    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            myThread.sleep(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }

    }
}

class MyThread extends Thread {
    public void run() {
        super.run();
        try {
            for (int i = 0; i < 500000; i++) {
                if (this.interrupted()) {
                    System.out.println("已经是停止状态了!我要退出了!");
                    throw new InterruptedException();
                }
                System.out.println("i=" + (i + 1));
            }
            System.out.println("我在for下面");
        } catch (InterruptedException e) {
            System.out.println("进MyThread类run方法中的catch了!");
            e.printStackTrace();
        }
        System.out.println("end!");
    }
}

运行结果如图 1-7所示
这里写图片描述
图 1-7 运行结果


二、使用stop暴力停止
使用stop()方法停止线程则是非常暴力的,而且stop是作废过期的方法,因此不推荐使用这种方法。
下面是代码示例

package com.vhqimk.thread;

/*
 * 测试stop方法终止线程的情况
 */
public class Test {
    public static void main(String[] args) {

        try {
            MyThread myThread = new MyThread();
            myThread.start();
            myThread.sleep(8000);
            myThread.stop();
        } catch (InterruptedException e) {

            e.printStackTrace();
        }

    }
}

class MyThread extends Thread {
    private int i = 0;

    public void run() {
        super.run();
        try {
            while (true) {
                i++;
                System.out.println("i=" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end!");
    }
}

运行结果如图 1-8所示
这里写图片描述
图 1-8 线程被暴力停止(stop)运行后图标呈灰色


三、使用interrupt方法中断线程
将方法interrupt()与return结合使用也能实现停止线程的效果,下面是具体示例:

package com.vhqimk.thread;

/*
 * 测试interrupt方法终止线程的情况
 */
public class Test {
    public static void main(String[] args) throws InterruptedException {

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

    }
}

class MyThread extends Thread {
    private int i = 0;

    public void run() {

        while (true) {
            if (this.isInterrupted()) {
                System.out.println("停止了!");
                return;

            }
            System.out.println("timer=" + System.currentTimeMillis());
        }

    }
}

运行结果如图 1-9所示
这里写图片描述
图 1-9 成功停止运行


总结:停止线程有三种方法,建议使用“抛异常”法来实现线程的停止,因为在catch块中可以对异常信息进行相关的处理,而且使用异常流能更好、更方便地控制程序的运行流程,不会像第三种方法那样出现多个return,造成污染,也不建议用stop方法强行终止线程,因为使用它可能产生不可预料的结果。

(正在学习高洪岩先生著的《java多线程编程核心技术》,例子摘自此书,有兴趣的可以查阅此书)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值