Java结束线程的三种方法及该如何选择

2025-05-29 0 48

java常用的结束一个运行中的线程的方法有3中:使用退出标志,使用interrupt方法,使用stop方法。

1.使用退出标志

即在线程内部定义一个bool变量来判断是否结束当前的线程

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
public class ThreadSafe extends Thread {

public volatile boolean exit = false;

public void run() {

while (!exit){

//do work

}

}

public static void main(String[] args) throws Exception {

ThreadFlag thread = new ThreadFlag();

thread.start();

sleep(5000); // 主线程延迟5秒

thread.exit = true; // 终止线程thread

thread.join();

System.out.println("线程退出!");

}

}

这种情况一般是将线程的任务放在run方法中的一个while循环中,而由这个bool变量来对while循环进行控制。

2.使用interrupt方法

这种方法需要判断当前的线程所处于的状态:
(1)当前线程处于阻塞状态时
线程处于阻塞状态一般是在使用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等方法时,会使线程处于阻塞状态。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
public class ThreadInterrupt extends Thread {

public void run() {

try {

sleep(50000); // 延迟50秒

}

catch (InterruptedException e) {

System.out.println(e.getMessage());

}

}

public static void main(String[] args) throws Exception {

Thread thread = new ThreadInterrupt();

thread.start();

System.out.println("在50秒之内按任意键中断线程!");

System.in.read();

thread.interrupt();

thread.join();

System.out.println("线程已经退出!");

}

}

注意这种情况写,使用 interrupt 方法结束线程的时候,一定要先捕获 InterruptedException 异常之后通过 break 来跳出循环,才能正常结束 run 方法。

(2)线程未处于阻塞状态时

使用 isInterrupted() 判断线程的中断标志来退出循环。当使用 interrupt() 方法时,中断标志就会置 true,和使用自定义的标志来控制循环是一样的道理。

?

1

2

3

4

5

6

7

8

9

10

11

12
public class ThreadSafe extends Thread {

public void run() {

while (!isInterrupted()) { //非阻塞过程中通过判断中断标志来退出

try {

Thread.sleep(5*1000); //阻塞过程捕获中断异常来退出

} catch (InterruptedException e) {

e.printStackTrace();

break; //捕获到异常之后,执行 break 跳出循环

}

}

}

}

3.使用stop方法来结束线程

?

1

2

3

4

5

6

7

8

9
public class Main {

public static void main(String[] args) throws InterruptedException {

MyThread myThread = new MyThread();

myThread.start();

Thread.sleep(3000); // 间隔3秒后

myThread.stop(); // 结束线程

System.out.println("结束了");

}

}

4.结束方法的选择

建议使用标志位和interrupt方法来结束线程,stop方法已经不建议再被使用了。
因为采用 stop 是不安全的,主要影响点如下:

  1. thread.stop() 调用之后,创建子线程线程就会抛出 ThreadDeatherror 的错误;
  2. 调用 stop 会释放子线程所持有的所有锁。导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈现不一致性。

以上就是Java结束线程的三种方法及该如何选择的详细内容,更多关于Java 结束线程的资料请关注快网idc其它相关文章!

原文链接:https://segmentfault.com/a/1190000039696074

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java结束线程的三种方法及该如何选择 https://www.kuaiidc.com/108243.html

相关文章

发表评论
暂无评论