java老大问我怎么停止一个线程,我上来就是一个stop,不为别的,就是玩

Posted 是馄饨呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java老大问我怎么停止一个线程,我上来就是一个stop,不为别的,就是玩相关的知识,希望对你有一定的参考价值。

近期也是在复习,因为多线程这在项目中几乎没有考虑过,所以也是打算恶补一下。

线程与进程

首先,我们肯定得知道线程是干嘛的呗,这里就简单描述一下。
在计算机中,我们把每个任务称为一个进程,就比如我现在打开了一个浏览器,那么这是不代表一个任务,我们又打开音乐播放器,这也算是一个任务。
那么线程呢,比如我们在用word打字的时候,word可以让我们一边打字,一边进行拼写检查,同时在后台还可以进行打印,我们把这种称为线程。

上边我们只是介绍了一下,下面我们进入正题。
先说一下停止线程的几种方式:

  • 使用退出标志,使得线程正常退出,可以设置布尔值,用volatile进行同步
  • 使用stop方法终止线程,使用stop方法可以强行终止正在运行或挂起的线程 thread.stop()强烈不建议用
  • 使用interrupt()方法终止线程。

1.设置标志位退出线程

public class Main{
    public static void main(String[] args) throws InterruptedException {
        HelloThread t =new HelloThread();
        t.start();
        Thread.sleep(1000);
        t.running=false;
    }
}
class HelloThread extends Thread {
    public volatile boolean running =true;
    @Override
    public void run() {
        int n =0;
        while (running){
            n++;
            System.out.println(n+"hello");
        }
        System.out.println("end");
    }
}

我们会发现设置一个同步信号量volatile,来判断 HelloThread 线程中的while 条件,如果while为false,那么就退出线程。

2.使用stop方法终止线程

public class Thread6 {
    public static void main(String[] args) throws InterruptedException {
        HelloThread t =new HelloThread();
        t.start();

        Thread.sleep(1000);
        t.stop();
    }
}

我们将Main 中的 t.running=false; 改为t.stop(); ,会发现也可以停止啊,那为啥不建议用。我们会发现stop方法已经被Deprecated了,也就是不推荐使用。
为什么呢?我们可以这样想,就像突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果。

3.使用interrupt()方法终止线程。

另一种方法是使用interrupt

public class Thread5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t =new MyThread();
        t.start();
        Thread.sleep(1);
        t.interrupt();
        t.join();
        System.out.println("end");
    }


}

class MyThread extends Thread{
    @Override
    public void run() {
        int n= 0;
        while (!isInterrupted()){
            n++;
            System.out.println(n+ "hello");
        }
    }
}

第二种方法,使用了sleep方法

class MyThread extends Thread{
    @Override
    public void run() {
        int n= 0;
        while (true){
            n++;
            System.out.println(n+ "hello");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

interrupt()方法 也可以终止线程,使用interrupt方法来终止线程可分为两种情况
1. 使用while(!isInterrupted()){……}来判断线程是否被中断,也就是我们上面这种
2. 线程处于阻塞状态,如使用了sleep方法

第一种方法会直接停止线程,而第二种方法会抛出java.lang.InterruptedException: sleep interrupted
at java.base/java.lang.Thread.sleep(Native Method),但还会继续执行。

在这里插入图片描述

以上是关于java老大问我怎么停止一个线程,我上来就是一个stop,不为别的,就是玩的主要内容,如果未能解决你的问题,请参考以下文章

老大让我优化数据库,我上来就分库分表,他过来就是一jio。。。

老大让我优化数据库,我上来就分库分表,他过来就是一jio。。。

老大让我优化数据库,我上来就分库分表,他过来就是一jio。。。

老大让我优化数据库,我上来就分库分表,他过来就是一jio。。。

老大让我优化数据库,我上来就分库分表,他过来就是一jio。。。

java多线程---停止线程