Java再学习——停止一个正在运行的线程

关于这个问题,先了解一下Thread类方法中被废弃的那些方法。suspend(), resume(),stop()/stop(Throwable obj),destroy()

首先,stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了,没必要去看了。我们只需瞧瞧suspend(), resume(), stop()这三个就行了;

suspend()——让当前线程暂停执行

resume()——让当前线程恢复执行

当调用suspend()的时候,线程并没有释放对象,因此当多线程的时候,如果其他线程要用到某个被suspend的线程占用的对象,就必须要等到它被resume()才可以,而这个过程就极易出现死锁。

所以,they are deprecated!

而stop()是最不应该的,因为你都不知道它的状态就stop()了,释放所有能释放的锁,而且如果run方法存在同步,还不一定能stop~正反方向,这个方法都不适合。

备注:对于废弃的方法本身了解就可以,更多还是要去分析废弃的原因,如果你喜欢进阶的话~

关于停止一个正在运行的线程,官方建议设置变量去关闭。形同如下:

public class APP {

    public static void main(String[] args) throws Exception {
        class MyThread extends Thread {
            boolean flag = true;

            @Override
            public void run() {
                while (flag) {
                    // do something
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("I'm running!");
                }
                System.out.println("I'm dead!");
            }

            public void stopThread() {
                flag = false;
            }
        }
        MyThread thread = new MyThread();
        thread.start();
        Thread.sleep(3000);
        thread.stopThread();
    }
}

也就是通过设置变量来关闭线程,当然如果你就是执行完一次,那当然就没必要设置变量了,因为这种线程都没必要单独处理停止行为。

其次,这个所说是变量但是这个变量设置还是有很多巧妙的地方,比如下面这中类型:

public class APP {

    public static void main(String[] args) throws Exception {
        class MyThread extends Thread {
            boolean isRunning = true;

            @Override
            public void run() {
                while (isRunning) {
                    // do something
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        System.out.println(e.getMessage());
                        isRunning = false;
                    }
                    System.out.println("I'm running!");
                }
                System.out.println("I'm dead!");
            }
        }
        MyThread thread = new MyThread();
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
    }
}

基本就是这样操作了~

原文地址:https://www.cnblogs.com/wytings/p/4950445.html