哪些情况可以终止线程呢

2023-11-01

哪些情况可以终止线程的进行?

在这里插入图片描述

题目解析

答案选C
A:线程使用sleep()方法,使线程挂起一段时间,并不是终止
B: 创建一个新线程时,对之前的线程没有影响
C:抛出一个例外,线程终止
D: 并不是终止,而是抢占,进程是资源分配的最基本单位,同一个进程创建的不同线程共享这些资源,当某一个线程优先级比较高时,它就会抢占其他线程的资源,导致其他线程没有资源可用,会造成阻塞

线程结束的三个原因

1、run方法执行完成,线程正常结束
2、线程抛出一个未捕获的Exception或者Error
3、直接调用该线程的Stop方法结束线程(不建议使用,容易导致死锁)

线程结束的三种方法-具体分析

①使用标志位退出线程
②使用stop方法强制终止线程
③使用interrupt终止线程

1,使用标志位推出线程

一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,就要使用一个变量控制循环

定义了一个退出标志 exit,当 exit 为 true 时,while 循环退出,exit 的默认值为 false.在定义 exit 时,使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同步,同一时刻只 能由一个线程来修改 exit 的值

public class ThreadSafe extends Thread {
  public volatile boolean exit = false; 
    public void run() { 
     while (!exit){
     //do something
     }
  } 
}

2,使用stop方法强制终止线程

程序中可以直接使用 thread.stop()来强行终止线程,但是 stop 方法是很危险的,就象突然关 闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是: thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror 的错误,并且会释放子 线程所持有的所有锁。

3,使用interrupt终止线程

当线程处于两种状态时,使用interrpt终止

(1)线程未处于阻塞状态:
使用 isInterrupted()判断线程的中断标志来退出循环,再使用 interrupt()方法时,中断标志就会置 true,和使用自定义的标志来控制循环是一样的

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (interrupted()) {
                    System.out.println("已经是停止状态了");
                    throw new InterruptedException();//中断异常
                }
                System.out.println("i=" + (i + 1));
            }
            System.out.println("我在for下面");
        } catch (InterruptedException e) {
            System.out.println("进run方法中的catch了!");
            e.printStackTrace();
        }
 
    }
}

(2)线程处于阻塞状态:如使用了sleep方法,同步锁的 wait,socket 中的 receiver,accept 等方法时,调用线程的 interrupt()方法

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("线程已经退出!");  
    }  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪些情况可以终止线程呢 的相关文章

随机推荐

  • java——编程案例

    文章目录 案例1 买飞机票 案例2 找素数 案例3 开发验证码 案例4 数组元素的复制 案例5 评委打分 案例6 数字加密 案例7 模拟双色球 案例1 买飞机票 import java util Scanner public class T
  • stm32ftp服务器实现文件传输,stm32 ftp服务器

    stm32 ftp服务器 内容精选 换一换 客户端压力机硬件要求如表1所示 负载均衡节点 LVS 硬件要求如表2所示 缓存节点 Nginx ATS 硬件要求如表3所示 源站节点 Nginx 硬件要求如表4所示 操作系统要求如表5所示 软件要
  • MSN下载2010最新版

    转载的 哈哈 我的笔记 MSN 最新微软官网下载地址 NLP伪原创技术早期并不是很受欢迎 基于主动学习的伪原创句法识别研究 这几年专注于Web开发 Web界面设计的心得在这篇文章中已经与大家分享 做项目时 如何做比较美观大方的数据输入窗体
  • apisix高性能网关-中文开发文档

    2020年6月12日13 48 33 github https github com apache incubator apisix 目前此项目已有成为apache孵化项目 官方中文文档 https github com apache in
  • 拓展人脉,把握机会,摆脱“孔乙己的长衫”

    孔乙己的长衫 学历究竟成为敲门砖还是枷锁 孔乙已是鲁迅笔下人物 穷困流倒还穿着象征读书人的长衫 迁腐 麻木 最近 大家自我调佩是 当代孔乙己 学历成为思想负担 找工作时高不成低不就 我将从以下几个方面来说一说我对这方面的看法 我认为 在当今
  • 1. 两数之和

    目录 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按
  • 数据结构--计算表达式完整版(涉及乘方)

    思路 两个栈 数据栈与符号栈 在描述优先级时 我们将加减描述为 I级 乘除为 II既 乘方为 III级 1 在之前的只有加减乘除的计算表达式里 就有了初步思路 当我们要计算的时候 局部计算函数 数字栈与符号栈 分别在数字栈顶取出两个操作数
  • i2c_SLAVE

    driver driver通过I2C的接口与DUT相连 负责接收DUT通过接口传来的地址数据等读写信息并作出反应 将sequencer中传来的trans中的数据驱动到总线上并根据设置的ack和nack作出回应 将总线上写来的数据存到tran
  • Visual Studio 2019 C语言程序(VS2019 C语言)

    新的Visual Studio 2019出来已经有一段时间了 博主也是一开始就从vs2017换到了vs2019 发现整体的操作流程还是有一定的改变 因为之前发表过一个vs2017的博客 对Visual Studio IDE和风格确实非常喜欢
  • Qt5 通过 QFtp 实现 Ftp文件下载

    在Qt5环境下使用自编译的QFtp库 参考官方提供的实例 对部分内容进行更改 实现了Ftp下载文件的客户端 详细代码如下 h头文件 ifndef FTPWINDOW H define FTPWINDOW H include
  • linux下查看某服务端口对应的进程ID

    Linux下查看某端口号所对应的进程ID 使用lsof命令 格式为 lsof i 端口号 例如 lsof i 30000 root Web Service CAServer lsof i 30000 COMMAND PID USER FD
  • oracle的io优化--db_writer_processes & dbwr_io_slaves对比

    author skate time 2011 09 29 db writer processes 和 dbwr io slaves对比 在计算机世界里 磁盘的发展速度远低于cpu memory 磁盘io现在已经成为计算机的瓶颈 对于orac
  • 揭密微信跳一跳小游戏那些外挂

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 Hahn 腾讯高级UI工程师 由 WeTest质量开放平台团队 发布于云 社区 WeTest 导读 张小龙 这个游戏发布以后 其实它的效果有点超出我们的预期 我们自己开玩笑说 这个
  • mysql数据表查询操作

    数据表查询操作 准备工作 导入之前需要先创建一个数据库 数据库资料传送门 使用新创建的数据库 使用 source 文件地址 导入数据 create database db charset utf8 use db source home py
  • win10网上邻居看不到别的共享电脑怎么样办

    https jingyan baidu com article 4853e1e5b714aa1909f72600 html 转载于 https www cnblogs com kuangke p 10901469 html
  • 【Dom获取&属性操作】JavaScript 全栈体系(十)

    Web APIs 第四章 操作元素属性 一 操作元素常用属性 还可以通过 JS 设置 修改标签元素属性 比如通过 src更换 图片 最常见的属性比如 href title src 等 语法 对象 属性 值
  • python+appium自动化测试-pytest+allure测试报告(一)

    来自APP Android端自动化测试初学者的笔记 写的不对的地方大家多多指教哦 一 Allure安装 1 pytest和allure插件安装 pip install allure pytest pip install pytest 2 A
  • python3+robotframework+selenium3 浏览器兼容性测试

    robot framework 测试浏览器兼容性 目前ride已支持一下浏览器 firefox ie chrome safari 本次我们已win 10中的ie为例 来看看如何使用python3 robotframework seleniu
  • 我是如何从通信转到Java软件开发工程师的?

    我的CSDN和公众号的读者里面有绝大部分都是在校学生 有本科的 也有专科的 我在微信里收到很多读者的提问 大部分问题都跟如何学习编程有关 有换专业自学的 有迷茫不知道如何学习的 有报培训班没啥效果的等等 我能感受到他们的诚意和焦虑 所以我觉
  • 哪些情况可以终止线程呢

    目录 哪些情况可以终止线程的进行 题目解析 线程结束的三个原因 线程结束的三种方法 具体分析 1 使用标志位推出线程 2 使用stop方法强制终止线程 3 使用interrupt终止线程 哪些情况可以终止线程的进行 题目解析 答案选C A