多线程之线程停止
发布日期:2022-04-11 08:52:48
浏览次数:6
分类:博客文章
本文共 2223 字,大约阅读时间需要 7 分钟。
结束线程有以下三种方法: (1)设置退出标志,使线程正常退出。 (2)使用interrupt()方法中断线程。 (3)使用stop方法强行终止线程(不推荐使用Thread.stop, 这种终止线程运行的方法已经被废弃,使用它们是极端不安全的!)
一、使用退出标志
一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。
使用一个变量来控制循环,例如:最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出,代码示例:
public class Demo8Exit { public static boolean exit = true; public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable() { public void run() { while (exit) { try { System.out.println("线程执行!"); Thread.sleep(100l); } catch (InterruptedException e) { e.printStackTrace(); } } } }); t.start(); Thread.sleep(1000l); exit = false; System.out.println("退出标识位设置成功"); }}
结果如下:
线程执行!线程执行!线程执行!线程执行!线程执行!线程执行!线程执行!线程执行!线程执行!线程执行!退出标识位设置成功
二、使用interrupt()方法
使用interrupt()方法来中断线程有两种情况:
1、线程处于阻塞状态
如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出InterruptException异常。阻塞中的那个方法抛出这个异常,通过代码捕获该异常,然后break跳出循环状态,从而让我们有机会结束这个线程的执行。
2、线程未处于阻塞状态
使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时,中断标志就会置true,然后break跳出循环状态。和使用自定义的标志来控制循环是一样的道理。
public class Demo9Interrupt { public static boolean exit = true; public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable() { public void run() { while (exit) { try { System.out.println("线程执行!"); //判断线程的中断标志来退出循环 if (Thread.currentThread().isInterrupted()) { break; } Thread.sleep(100l); } catch (InterruptedException e) { e.printStackTrace(); //线程处于阻塞状态,当调用线程的interrupt()方法时, //会抛出InterruptException异常,跳出循环 break; } } } }); t.start(); Thread.sleep(200l); //中断线程 t.interrupt(); System.out.println("线程中断了"); }}
其中一次运行结果如下:
线程执行!线程执行!线程执行!线程中断了
此时线程未处于阻塞状态。
其中一次运行结果如下:
线程执行!线程执行!线程中断了java.lang.InterruptedException: sleep interrupted at java.base/java.lang.Thread.sleep(Native Method) at com.zwh.Demo9Interrupt$1.run(Demo9Interrupt.java:20) at java.base/java.lang.Thread.run(Thread.java:844)
此时线程处于阻塞状态。
转载地址:https://www.cnblogs.com/zwh0910/p/15868048.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月19日 23时54分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
说说如何在 Linux 中,新建账号
2019-04-26
说说如何在 linux 中搭建 FTP 服务
2019-04-26
说说 Python 的正则表达式
2019-04-26
说说 Spring Boot 属性配置源的加载顺序
2019-04-26
说说如何查看 Python Django 的版本号
2019-04-26
说说 Python Django 应用的基础目录结构
2019-04-26
说说如何在 Python 的正则表达式中使用分组
2019-04-26
说说 Python 正则表达式的匹配类型
2019-04-26
说说 Python 的贪心和非贪心匹配策略
2019-04-26
说说在 Python 中,如何找出所有字符串匹配
2019-04-26
说说 Python 正则表达式中的那些字符类别码
2019-04-26
说说 Spring Boot 的条件化注解
2019-04-26
说说如何使用 Python 在 word 中创建表格
2019-04-26
Python 基础知识考题与解答(2020 版)
2019-04-26
说说 Oracle 的 SYSDATE 函数
2019-04-26
说说 Oracle 的 NVL 与 NVL2 函数
2019-04-26
说说 TCP 协议以及三次握手流程
2019-04-26
说说 Oracle 的 TRUNC 函数
2019-04-26
系统架构设计笔记(41)—— 系统过渡计划
2019-04-26