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。。。