多线程的关闭
多线程的启动是一个重要的问题,大部分的多线程都是运行在一个死循环中的,所以关闭多线程也是一个很重要的问题。因为线程就是进程中处理问题的分支,其共享该进程中的资源,可以通过共享的某种资源来进行控制线程的开关,同样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类型,调用后不会包保留。用于线程自己查看是否自己被关闭。
方法名称 | 返回值类型 | 返回值 | 说明 |
|
|
| 关闭了or没关闭 |
|
| 无 | 调用后会将线程停止 |
|
|
| 用于线程自己查看是否被关闭 |