停止线程的三种方法

来源:互联网 发布:javascript new关键字 编辑:程序博客网 时间:2024/06/16 17:45

在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多线程编程核心技术》,例子摘自此书,有兴趣的可以查阅此书)

原创粉丝点击