文/朱季谦 首先,先抛出一个问题,该如何安全而优雅地停止线程?...这道问题的背后,可以很小,小到只是简单终止一个Thread线程,也可以很大,大到例如Dubbo应用的优雅下线......它们其实都有一个共同之处,即非一刀断式地暴力停止某个进程或者线程,而是能够实现在终止过程中...,有机会去清理资源,跑完剩余的任务,最后没有任何资源在运行了,才做最后结束,这才算安全而优雅地停止。...在Java多线程当中,停止线程的方法,其中,有一个已经过期而不建议使用的方式stop(),它停止线程的方式比较简单粗暴,不保证线程的资源正常释放就直接停止了,也就意味着,可能还有线程正在跑,没有运行完成...因为线程执行interrupt()方法并不会直接就终止线程。 接下来,就简单分析一下,interrupt()是如何实现安全而优雅地终止线程的。
重新系统的学习一下Java多线程部分。参考书籍为《java多线程编程核心技术》。...在Java中,有以下三种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,即run方法完成后,线程终止; 使用stop方法,强行终止线程,不推荐使用,可能会产生不可预料的后果; 使用interrupt...使用interrupt方法停止线程 interrupt()方法仅仅是在当前线程中打了一个停止标记,并不会真正的停止线程。...可以看出调用interrupt方法并没有停止线程。...判断线程是否是停止状态 Thread.java类中提供了两种方法判断线程是否是停止状态: this.interrupted():测试当前线程是否已经中断。执行后具有将状态置清除为false的功能。
简介 一般情况下,线程执行完成后就会结束,但有的时候我们可能需要在它正常执行完成前就停止它,可以考虑使用以下三种方法: 使用Thread中的stop方法,这个方法已经被标为已废弃,不推荐使用,原因是stop...使用自定义标志停止线程 这里定义了一个变量flag,主线程会在3秒后将flag设置为false,当flag为false的时候,run方法里面的循环就会结束,线程也就停止了。...MyThread(); myThread.start(); Thread.sleep(3000); myThread.flag = false; } } 使用线程中断机制停止线程...线程中断有关的三个方法: interrupt(),中断线程。...1.主线程在3秒后更改flag状态,但是线程还处于sleep()阻塞中,需要等到sleep()时间结束也就是10秒后线程才停止。
要点 线程的用法 线程的stop方法 ---- 线程stop过程中存在的问题 interrupt中断的用法 ---- 解释清楚使用boolean标志位的好处 interrupt底层的细节 能转移话题到线程安全...,并阐述无误 目录 如何停止一个线程【概述】 为何不能简单地停止一个线程?...【Deprecated v.不赞成的;反对的;】 以上是JDK提供的停止线程的方法, 但是很早就被废弃了; 主要就是说线程被直接停止掉是不安全, 涉及到了很多锁之类的细节问题;【下面细说】 所以不能直接简单地停止线程...()既然是一个非静态方法, 那它的底层是需要引用到其对应的一个Java线程对象【java_thread】的; 所以isInterrupted()被调用的时候, 它的底层首先是找到java_thread...interrupt()的源码本质, 就是对self【java线程对应的底层线程的对象】加了个锁, 然后把中断状态位interrupted_置为true; ?
java停止线程的方式 1、使用Interrupt来通知 while (!...isInterrupted() && more work to do) { do more work } 首先通过 Thread.currentThread().isInterrupt() 判断线程是否被中断... Thread.sleep(5); thread.interrupt(); } } 2、使用volatile标志一个字段,通过判断这个字段true/false退出线程...Thread(r); thread.start(); Thread.sleep(5000); r.canceled = true; } } 以上就是java...停止线程的方式,希望对大家有所帮助。
专栏介绍 【Java】 目前主要更新Java,一起学习一起进步。...第二章 线程安全 2.1 线程安全 2.2 线程同步 2.3 同步代码块 2.4 同步方法 2.5 Lock锁 第三章 线程状态 3.1 线程状态概述 3.2 Timed Waiting(计时等待)...public static void sleep(long millis) : 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执 行)。...这种问题,几个窗口 ( 线程 ) 票数不同步了,这种问题称为线程不安全。 线程安全问题都是由全局变量及静态变量引起的。...要解决上述多线程并发访问一个资源的安全性问题 : 也就是解决重复票与不存在票问题, Java 中提 供了同步机制 ( synchronized ) 来解决。
2.1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的。...这种问题,几个窗口 ( 线程 ) 票数不同步了,这种问题称为线程不安全。 线程安全问题都是由全局变量及静态变量引起的。...若每个线程中对全局变量、静态变量只有读操作,而无写 操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步, 否则的话就可能影响线程安全。...要解决上述多线程并发访问一个资源的安全性问题 : 也就是解决重复票与不存在票问题, Java 中提供了同步机制 ( synchronized ) 来解决。...根据案例简述: 为了保证每个线程都能正常执行原子操作 ,Java 引入了线程同步机制。 那么怎么去使用呢?有三种方式完成同步操作: 1. 同步代码块。 2.
将结果赋值 index 数据漏过 主要是由于线程1修改后index值已改变未输出前,cpu将权利交给线程2,线程2继续累加并输出 2.数据重复 主要是由于线程1执行到index +1但是还没赋值index...,cpu就将执行权交给线程2 3.超过最大值 当index=499 时线程1和线程2都看到满足条件,线程1将index增加到500后,线程2恢复执行变为501 synchronized synchronized...成功之前都必须从主内存中获取数据,而不是缓存,在monitor exit 运行成功后,共享变量被更新的值必须刷入主内存中 synchronied 严格遵守 java happens-before 规则,...如果monitor的计数器为0,则意味着monitor的lock还没有被获得,某个线程获得之后计数器加1 如果一个monitor的所有权的线程重入,则会导致moniter的计数器再次累加 如果monitor...已经被其他线程所拥有,则其他线程再尝试获取所有权时,被陷入阻塞状态,直到monitor计数器变为0,才能再次获取 Monitor exit 释放monitor所有权就是将计数器减一,前提是必须拥有所有权
线程停止:在线程处理完任务之前,停掉正在做的操作,也就是放弃当前操作。 在java中有三种方法可以实现线程的停止: 使用退出标志,使线程正常退出,也就是当run方法执行完后线程终止。...,并没有真正停止线程。...1.7.2判断线程是否是停止状态: 在Java的SDK中,Thread.java类里提供了两种方法判断线程是否停止 ? ?...1.7.4在沉睡中停止: 如果线程在sleep()状态下停止线程,会有什么效果呢?...不论是先睡眠,然后再睡眠中被停止,还是先停止,在睡眠。都会报错。 1.7.5能停止的线程——暴力停止: 使用stop()方法停止线程是暴力的。
---- 前沿 ---- 在Java中没有一种安全的抢占式方法来停止线程任务。只有一些协作式的机制,使请求取消的任务和代码都遵循一种协商好的协议。...设置“已请求取消”标志来停止线程任务 ---- 示例:Java17源码中的 java.util.stream.AbstractShortCircuitTask 使用volatile boolean canceled...注意:调用interrupt()方法并不意味着立即停止目标编程正在进行的工作,而只是传递了请求中断的消息。 使用静态的interrupted()方法时应该小心,因为它会清除当前线程的中断状态。...中断线程,我们可使用java.util.concurrent.Future。...示例: ch.qos.logback.core.net.server.RemoteReceiverStreamClient#run 小结 ---- 正确停止线程任务的实现方式: 1、设置“已请求取消
线程停止 线程停止常用方法 : -- 1. 使用 interrupt() 方法停止线程; -- 2. 使用退出标志, 让线程正常退出; -- 3....执行结果 : 113 114 115 116 主线程执行完毕 停止状态, 抛出异常退出 线程中捕获异常代码块 java.lang.InterruptedException at base.ExceptionInterruptDeo...java.lang.Thread.sleep(Native Method) at base.SleepInterruptDemo$MyThread.run(SleepInterruptDemo.java...at java.lang.Thread.sleep(Native Method) at base.SleepInterruptDemo$MyThread.run(SleepInterruptDemo.java...at java.lang.Thread.stop(Unknown Source) at com.hanshuliang.thread.StopDemo.main(StopDemo.java:31) -
在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程。 使用线程中断方法 interrupt 停止线程。 使用 stop 停止线程。...其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给线程足够的时间来处理停止前的保存工作,就会造成数据不完整的问题...@Deprecated 修饰的不建议使用的过期方法,并且在注释的第一句话就说明了 stop 方法为非安全的方法。...在最新版本 Java 中,此方法已经被直接移除了,所以强烈不建议使用。...; 最后是 stop 方法,虽然它也可以停止线程,但此方法已经是过时的不建议使用的方法,在 Java 最新版本中已经被直接移除了,所以不建议使用。
在学习Java语言的过程中,多线程是一个算是进阶的选择。我最近又学到了一个新技能ReentrantLock类,这个应该目前最简单的线程安全使用方式了,当然暴力synchronized除外。...首先回顾一下之前的线程安全常用同步类的文章: CountDownLatch类在性能测试中应用 CyclicBarrier类在性能测试中应用 Phaser类在性能测试中应用 Java线程同步三剑客 下面介绍一下...我理解为这是一个简单易上手的线程安全操作类,不需要理解synchronized带来的语法,不需要其他线程同步类锁需要的对各类API功能记忆。...ReentrantLock真的是一个非常好用的多线程安全工具类。...这一点跟之前的文章如何mock固定QPS的接口、moco固定QPS接口升级补偿机制中用到的线程安全之流量控制类java.util.concurrent.Semaphore的使用基本一致,相比之下java.util.concurrent.locks.ReentrantLock
关于线程安全,是指当多个线程访问同一个变量时,该变量不会因为多线程访问产生意想不到的问题,为了避免多线程访问的不可预知的问题,对于程序中多线程能访问到的变量要加锁,即加synchronized,放在同步块中...当然jdk中自带的一些类本身就实现了该机制,本身就是线程安全的,比如StringBuffer,Vector等。多线程是程序中比较高级的一个方面,希望你能深入理解!
进入catch,线程的是否处于停止状态:" + this.isInterrupted()); e.printStackTrace(); } } } Main.java...(MyThread.java:13) 线程先调用interrupt标记中断状态,然后线程再睡眠。....run(MyThread1.java:19) 四、停止线程方法3:stop()暴力停止 线程调用stop()方法会被暴力停止,方法已弃用。...) 五、停止线程方法4:使用return停止线程 调用interrupt标记为中断状态后,在run方法中判断当前线程状态,如果为中断状态则return,能达到停止线程的效果。...备注:建议使用“抛异常”的方法来实现线程的停止,因为在catch块中还可以将异常向上抛,使线程停止的事件得以传播 参考:《Java多线程编程核心技术》
同样在我们 Android 开发中多线程可以说是随处可见了,如执行耗时操作,网络请求、文件读写、数据库读写等等都会开单独的子线程来执行。 那么你的线程是安全的吗?线程安全的原理又是什么呢?...(本文内容是个人学习总结浅见,如有错误的地方,望大佬们轻拍指正) 2 线程安全 了解线程安全的之前先来了解一下 Java 的内存模型,先搞清楚线程是怎么工作的。...到这里,我们可以引出本文的主题了 --【线程安全】。...那么 Java 是如何来解决上述问题来保证线程安全,保证共享内存的原子性、可见性、有序性的呢?...3 线程同步 Java 提供了一系列的关键字和类来保证线程安全 3.1 Synchronized 关键字 保证方法或代码块操作的原子性 Synchronized 保证⽅法内部或代码块内部资源(数据)的互斥访问
作为一个Java web开发人员,很少也不需要去处理线程,因为服务器已经帮我们处理好了。...回归正题,当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说StringBuilder中,有这么一句,“将StringBuilder 的实例用于多个线程是不安全的。...”,那么下面手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果。 ...上述测试,我们发现,存在成员变量的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的。...想想在使用struts1时,不推荐创建成员变量,因为action是单例的,如果创建了成员变量,就会存在线程不安全的隐患,而struts2是每一次请求都会创建一个action,就不用考虑线程安全的问题。
这些面试题常被问,答案是,左边的都是非线程安全,右边都是线程安全! 然后又问你,什么是线程安全,什么是非线程安全呢?...A.线程安全 当多个线程类并发操作某类的方法A,来修改这个A方法的某个成员变量的值B,B不会出错,则我们就说,该的这个A方法是线程安全的。 ...B.非线程安全 当多个线程类并发操作某类的方法A,来修改这个A方法的某个成员变量的值B,B会出错,则我们就说,该的这个A方法是非线程安全的。...线程执行dou()方法的时候,实例pi返回的是当前线程的对象。这样的调用是线程安全的。...线程安全跟非线程安全如何取舍 从第一个例子可得知,非线程的方法添加synchronized修饰就可以转化为线程安全,但是性能会相差20倍左右,如果不加的话,该类的成员变量又可能发生错误,所以具体就看你的需求
i)停止(stop)一个线程(靠着return, break,或异常手段) 马克-to-win:java的官方文档说不要用stop方法来停止一个线程。...所以我们会通过设置标志,通过return, break,异常等手段来控制流程自然停止。
写过多线程的童鞋,可能都会遇到一个问题,那就是线程如何优雅的停止。这里主要介绍两个办法:标志位 和 thread.isInterrupted。...1.通过 标志位 来终止线程 private static class Runner implements Runnable{ private long i; private (volatile...Thread Name stop:" + Thread.currentThread().getName()); } } thread 被中断之后,就可以无视 sleep wait 等方法,马上停止...永远停止不了。...总结: 显然,通过 Thread.currentThread().isInterrupted() 来停止线程,显然要比标示位优雅一些,但要防止条件判断永远无法生效。
领取专属 10元无门槛券
手把手带您无忧上云