多线程的关闭

 多线程的启动是一个重要的问题,大部分的多线程都是运行在一个死循环中的,所以关闭多线程也是一个很重要的问题。因为线程就是进程中处理问题的分支,其共享该进程中的资源,可以通过共享的某种资源来进行控制线程的开关,同样java本身也存在着关闭多线程的方法,所以我们来梳理一下。

关闭的方法

  • 通过进程中共享的某种资源控制

我们通过共享的静态属性running来控制线程中循环是否进行,来判断是否可以关闭线程。下面是实现的代码,可以自己跑一跑。

/*
*       如何让子线程停下来
*       通过使用共享变量进行控制
* */

import java.util.Scanner;
import java.util.concurrent.TimeUnit;

class MyThread extends Thread{
    @Override
    public void run() {
        while(Main.running){
            // 设置休眠,每秒打印一次
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("子线程在打印中");
        }
    }
}

public class Main {
    public static boolean running = true;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        MyThread myThread = new MyThread();
        myThread.start();
        
        String str = scanner.nextLine();
        running = false;
    }
}

我们通过静态属性running来控制多线程的开关,不妨将代码复制下来,测试一下

  • 通过Thread类内部实现的方法来关闭多线程

在每个Thread对象中存在一个类似running的属性,用来控制线程是否进行,所以每个对象中都存在一个interrupt的方法,可以让其它线程来调用,当某个线程的该方法被调用时,则就修改了类似于running的属性,此时就将线程关闭。

代码展示

/*
 *   关闭多线程2
 *
 *       通过多线程对象中的interrupt方法来关闭多线程
 * */

import java.util.Scanner;
import java.util.concurrent.TimeUnit;

class MyThread2 extends Thread {
    @Override
    public void run() {

        while (!this.isInterrupted()) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
            System.out.println("子线程打印中...");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread2 myThread2 = new MyThread2();
        myThread2.start();

        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        
        myThread2.interrupt();
    }
}

这里的要说一下这里用到的三个方法isinterrupted和interrupt和interrupted方法

  • isinterrupted方法的返回值是boolean类型,返回值为true则表示线程已经停止,否则为没停止,用于查看第三方的线程是否关闭,值会被保留
  • interrupt方法的返回值是void类型,调用后会将线程关闭
  • interrupted方法的返回值是boolean类型,调用后不会包保留。用于线程自己查看是否自己被关闭。

方法名称

返回值类型

返回值

说明

isinterrupted

boolean

true或者false

关闭了or没关闭

interrupt

void


调用后会将线程停止

interrputed

boolean

true或者false

用于线程自己查看是否被关闭