• 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();
        }
    }

    基本就是这样操作了~

  • 相关阅读:
    2019.8.16
    一种抠环的办法
    [HAOI2015]树上染色
    有关树形背包
    2019.7.27
    有关矩阵快速幂
    2019.7.25
    欧拉函数(转载)
    2019.7.22
    phpstudy集成环境安装redis扩展
  • 原文地址:https://www.cnblogs.com/wytings/p/4950445.html
Copyright © 2020-2023  润新知