如何停止一个正在运行的线程

如何停止一个正在运行的线程? 如何停止一个正在运行的线程? 这个一个面试常问的问题, 我们有两种办法, 分别是stop()和interrupt(), 但stop()太过于暴力, 无法保证线程业务的原子性, 且已过期, 不推荐使用. 使用stop()来停止线程 stop()方法让线程立即停止运行, 这种暴力停止可能会破坏线程业务的原子性, 如下所示: static class MyThread extends Thread { ... 阅读详情

总工有三种方式可停止当前正在运行的线程:

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止;
  2. 使用interrupt方法中断线程 ;
  3. 使用stop方法强行终止(不推荐使用该方法,目前该方法已作废)。

 (1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止

代码示例:

public class MyThread extends Thread {
volatile boolean flag = false ; // 线程执行的退出标记
@Override
public void run() {
while(!flag) {
System.out.println("MyThread...run...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws
InterruptedException {
// 创建MyThread对象
MyThread t1 = new MyThread() ;
t1.start();
// 主线程休眠6秒
Thread.sleep(6000);
// 更改标记为true
t1.flag = true ;
}
}

输出效果: 

MyThread...run...

MyThread...run...

 (2)使用interrupt方法中断线程。

代码示例:

package com.company.test;

public class MyThread extends Thread {
    // 线程执行的退出标记
    @Override
    public void run() {

        while (!Thread.currentThread().isInterrupted()) {
            System.out.println(Thread.currentThread().isInterrupted());
            System.out.println("MyThread...run...");
        }
        System.out.println(Thread.currentThread().isInterrupted());
    }

    public static void main(String[] args) throws InterruptedException {
        // 创建MyThread对象
        MyThread t1 = new MyThread();
        t1.start();
        // 主线程休眠2秒
        Thread.sleep(3000);
        // 调用interrupt方法
        t1.interrupt();//并不能直接中断对应子线程;之线程无法感知;
    }
}

输出效果:

MyThread...run...
false
.....................
false
MyThread...run...
false
MyThread...run...
true

注意!!!

如果在子线程中用Thread.sleep(),需要对其进行异常捕获,然而捕获以后,线程的中断(讯息)将会被捕获且清除,从而子线程无法感知上层方法中--实例线程对象调用interrupt()对线程的中断,即
Thread.currentThread().isInterrupted()

显示结果为false;线程将一直运行。

示例代码:

public class MyThread extends Thread {
    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            System.out.println(Thread.currentThread().isInterrupted());
            System.out.println("MyThread...run...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().isInterrupted());
        }
    public static void main(String[] args) throws
            InterruptedException {
        // 创建MyThread对象
        MyThread t1 = new MyThread() ;
        t1.start();
        // 主线程休眠2秒
        Thread.sleep(3000);
        // 调用interrupt方法,对子线程进行中断
        t1.interrupt();
    }
}

显示结果:

false
MyThread...run...
false
MyThread...run...
false
MyThread...run...
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.company.test.MyThread.run(MyThread.java:10)
false
MyThread...run...
false
MyThread...run...
........

........

 可见,在子线程中使用异常捕获之后,线程将无法感知上层方法对它的中断。

但非要让子线程感知中断,只能通过手动调用的方式:

修改后的代码:


public class MyThread extends Thread {
    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            System.out.println(Thread.currentThread().isInterrupted());
            System.out.println("MyThread...run...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                /**
                 * 手动调用恢复中断
                 */
                Thread.currentThread().interrupt();
                System.out.println(Thread.currentThread().isInterrupted());
            }
        }
        System.out.println(Thread.currentThread().isInterrupted());
        }
    public static void main(String[] args) throws
            InterruptedException {
        // 创建MyThread对象
        MyThread t1 = new MyThread() ;
        t1.start();
        // 主线程休眠2秒
        Thread.sleep(3000);
        // 调用interrupt方法,对子线程进行中断
        t1.interrupt();
    }
}

显示结果:

false
MyThread...run...
false
MyThread...run...
true
true
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.company.test.MyThread.run(MyThread.java:10)

Process finished with exit code 0

可见,通过手动调用后,线程执行可以被中断。

(3)使用stop方法强行终止

public class MyThread extends Thread {
volatile boolean flag = false ; // 线程执行的退出标记
@Override
public void run() {
while(!flag) {
System.out.println("MyThread...run...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws
InterruptedException {
// 创建MyThread对象
MyThread t1 = new MyThread() ;
t1.start();
// 主线程休眠2秒
Thread.sleep(6000);
// 调用stop方法
t1.stop();
}
}

现在编码中,通过stop强行停止线程的方法已经被废弃。

MTK-AWB 小结 (二) 调试总结:可以将offset 对应的ratio加大,保留更多的喜好色(偏色),影响WF statistic gain,从而影响最终的awb gain。这一部分前期CCT校准的时候就会算出一组默认值,当然这个offset offse 值用于优化T,S,wf 光下的偏色喜好度. offset。后面遇到 A H Shad 光收白或者偏色,还可以优化 A 的offset ,H offset,shad offset.new offset 计算过程(Day locus offset 和M/G offset ) 阅读详情

相关推荐

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

m0_58098052的博客 1595

运行中的线程如何停止?

停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程: 1、使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 2、使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。 3、使用interrupt方法中断线程

weixin_49100429的博客 3209

手把手教你用FPGA实现SGMII接口:从IP核配置到板级调试全流程

本文详细介绍了如何在Xilinx 7系列FPGA上实现SGMII(Serial Gigabit Media Independent Interface)接口的全流程,包括IP核配置、约束编写和硬件调试。通过具体的硬件选型建议、软件工具链配置和PCB设计规范,帮助开发者快速构建稳定可靠的千兆通信链路,并提供了常见故障排查和性能优化技巧。

weixin_29194693的博客 296

如何停止一个正在运行的线程?弄得一脸懵懂

1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程--异常法4. 在沉睡中停止5. 能停止的线程---暴力停止6.方法stop()与java.lang.ThreadDeath异常7. 释放锁的不良后果8. 使用return停止线程停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可 真正做到线程的终止。不过,要注意的是,停止线程最好不要使用Thread.stop()方法,因为这个方法是不安全的,而且是已被废弃的方法。

2301_76936922的博客 1396

那些年对支付宝的研究[整理]

支付宝功能强大.他内部各个功能间的跳转是通过Uri 实现的.而使用window.location.href 即可.跟浏览器一样的协议.很方便 H5启动支付宝: alipays://platformapi/startapp?appId=20000067&url=网址 alipays://platformapi/startapp?appId=20000691&url=网址 ali...

技术专研 8916

自动驾驶车辆纵向控制实战:基于CARLA与ROS2的PID算法实现

本文详细介绍了基于CARLA与ROS2的自动驾驶车辆纵向控制实战,重点讲解了PID算法的实现与应用。通过搭建仿真环境、实现定速巡航和自适应巡航功能,帮助开发者掌握自动驾驶核心技术。文章还分享了系统集成、仿真验证及常见问题的调试技巧,为自动驾驶开发提供实用指导。

weixin_33728708的博客 355

终止线程 4 种方式

1、正常运行结束 程序运行结束,线程自动结束。 2、使用退出标志退出线程 一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如: 最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while 循环是否退出,代码示例: public class ThreadSafe extends Thread { public volatile b

Be Like 1万+

基于zynq在linux下的AXI-CAN实战

从petalinux的搭建,到uboot、kernel、rootfs的调试、打包提示:以下是本篇文章正文内容,下面案例可供参考本次要讲述的zynq的AXI-CAN实战小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

qq_45521099的博客 3165

如何停止一个线程?

停止线程在java语言中并不像break语句那样干脆,还需要一些技巧性的处理。停止一个线程意味着在线程处理完任务之前停止正在做的操作,也就是放弃当前的操作,虽然这看起来非常简单,但是必须做好防范措施,以便达到预期的效果。停止一个线程可以使用Thread.stop()方法,但不推荐使用此方法,虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是被弃用作废的。大多数情况下,停止一个线程使用Thread.interrupt()方法,但这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成

贾欣晓的博客 4587

A B C三个气象站的小波分析结果解读

在小波分析的过程中,信号的不同频率分量会在不同的尺度上显现,而纵轴上的数值表示信号在相应尺度上的强度或能量。2. **小波方差的横轴(水平轴)**:横轴上的尺度表示用于分析的小波函数的尺度。1. **共同趋势:** 在所有三个点的小波方差图中,随着尺度的增加,方差逐渐增大,尤其是在较大的时间尺度上。3. **尺度30的特殊性:** 在所有点的小波方差图中,尺度30似乎是一个特殊的点,对应着一个较长的时间尺度上的波动或变化。2. **方差的大小:** 方差的大小反映了在相应尺度下信号的波动强度。

weixin_44259522的博客 859

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 64

终止线程的四种方法

正常运行结束 程序运行结束,线程自动结束。 使用退出标志退出线程 一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的 运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如: 最直接的方法就是设一个 boolean 类型的标志,并通过设置这个标志为 true 或 false 来控制 while 循环是否退出,代码示例...

霓虹深处 3051

运放单电源供电和双电源供电的实际应用案例

文章摘要:本文对比分析了运放单电源与双电源供电的典型应用场景及电路设计要点。单电源供电适用于低成本、小体积设备,如便携音箱(5V供电+中点偏置)、工业4-20mA信号转换(12V供电+电压跟随)和物联网传感器(3.3V低功耗设计);双电源供电则适合高精度要求场景,如Hi-Fi音响(±15V对称输出)、医疗设备(±5V微弱信号放大)和精密仪器(±15V宽动态范围)。文末提供常见运放选型对照表,涵盖LM324、TL082等型号的供电参数与核心特性,为不同应用场景提供选型参考。(149字)

qq_37999850的博客 609

如何停止一个正在运行的线程?

来判断thread对象所代表的线程是否停止,但从控制台打印的结果来看,线程并未停止,这也证明了interrupted()方法的解释,测试当前线程是否已经中断。我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程。由于stop()方法以及在JDK中被标明为“过期/作废”的方法,显然它在功能上具有缺陷,所以不建议在程序张使用stop()方法。上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。

jj1245_的博客 732

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中如何停止一个正在运行的线程

来判断thread对象所代表的线程是否停止,但从控制台打印的结果来看,线程并未停止,这也证明了interrupted()方法的解释,测试当前线程是否已经中断。我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程。由于stop()方法以及在JDK中被标明为“过期/作废”的方法,显然它在功能上具有缺陷,所以不建议在程序张使用stop()方法。上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。

maruofan666的博客 3215

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

说说 如何停止一个正在运行的线程?

停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程:使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。使用interrupt方法中断线程。

2301_77690238的博客 1244

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

停止一个正在运行的线程的三种方法

点个关注,必回关。

ManuMAX的博客 602

java中如何停止一个正在运行的线程

中断是一种线程间的通信机制,允许一个线程向另一个线程发送信号,表示“你应该停止当前工作”。被中断的线程可以决定如何响应中断请求,通常是退出运行。Java中的线程停止是通过协作的方式实现的,而不是强制中断。中断机制:通过请求线程停止,并让线程定期检查中断状态。此方法是Java推荐的线程停止方式,尤其是在涉及阻塞操作时。标志位:通过共享的布尔标志位控制线程的运行。这种方法适用于不涉及阻塞操作的场景。这两种方法都能确保线程安全地退出,而不会引发资源泄漏或数据不一致问题。理。

Flying_Fish_roe的博客 801

java如何停止一个正在运行的线程

停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。 使用interrupt方法中断线程。 1. 停

mingchengtx的专栏 1581

Java基础:如何停止一个正在运行的线程?

虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。来判断thread对象所代表的线程是否停止,但从控制台打印的结果来看,线程并未停止,这也证明了interrupted()方法的解释,测试当前线程是否已经中断。我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程。不过还是建议使用“抛异常”的方法来实现线程的停止,因为在catch块中还可以将异常向上抛,使线程停止事件得以传播。

学亮编程手记 1192

如何正确的停止一个正在运行的线程?

点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!作者:菊子cnblogs.com/greta/p/5624839.html停止一个线程意味着在任务处理完任务之前停掉正在...

Java笔记虾 1580
上一篇: 如何让多个线程按顺序执行
下一篇: 什么是shell
黄金分割律
博客等级 码龄4年 61粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值