首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文搞懂 Java 线程中断

在之前的一文《如何"优雅"地终止一个线程详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享的——线程中断。...下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。...try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } 此时线程被打断后,...答案:不会,因为虽然给线程发出了中断信号,但程序并没有响应中断信号的逻辑,所以程序不会有任何反应。...可以看出 sleep() 方法被中断后会清除中断标记,所以循环会继续运行。。

63140
您找到你想要的搜索结果了吗?
是的
没有找到

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

G 队列 M 从队列中提取 G,并执行 P 的个数就是GOMAXPROCS(最大256),启动时固定的,一般不修改 M 的个数和 P 的个数不一定一样多(会有休眠的M 或 P不绑定M )(最大10000...这里留下第一个问题: 如果一个G任务执行时间太长,它就会一直占用 M 线程,由于队列的G任务是顺序执行的,其它G任务就会阻塞,如何避免该情况发生?...这里的寻找的 G 从下面几方面找: 当前 M 所绑的 P 队列找 去别的 P 的队列找 去全局 G 队列找 G任务的执行顺序是,先从本地队列找,本地没有则从全局队列找 程序启动的时候,首先跑的是主线程...,然后这个主线程会绑定第一个 P 入口 main 函数,其实是作为一个 goroutine 来执行 解答问题-① 协程的切换时间片是10ms,也就是说 goroutine 最多执行10ms就会被 M 切换到下一个...这也就直接导致了 M 最多的个数是多少,而 M 的个数就决定了各个 G 队列能同时被多少个 M 线程来进行调取执行!

1.9K30

Java线程中断(Interrupt)与阻塞(park)的区别

线程中断 在一个线程正常结束之前,如果被强制终止,那么就有可能造成一些比较严重的后果,设想一下如果现在有一个线程持有同步锁,然后在没有释放锁资源的情况下被强制休眠,那么这就造成了其他线程无法访问同步代码块...因此我们可以看到在 Java 类似 Thread#stop() 方法被标为 @Deprecated。...针对上述情况,我们不能直接将线程给终止掉,但有时又必须将让线程停止运行某些代码,那么此时我们必须有一种机制让线程知道它该停止了。...了解完中断的基本概念后,线程的中断还有需要其他需要注意的点: 设置线程断后线程内调用 wait()、join()、slepp() 方法的一种,都会抛出 InterruptedException 异常..."); } } 上述代码的执行结果为: Copy 线程:MyThread开始执行 main主线程执行 线程:MyThread执行结束 main主线程执行结束 可以看到,myThread

28530

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

G 队列 M 从队列中提取 G,并执行 P 的个数就是GOMAXPROCS(最大256),启动时固定的,一般不修改 M 的个数和 P 的个数不一定一样多(会有休眠的M 或 P不绑定M )(最大10000...这里留下第一个问题: 如果一个G任务执行时间太长,它就会一直占用 M 线程,由于队列的G任务是顺序执行的,其它G任务就会阻塞,如何避免该情况发生?...这里的寻找的 G 从下面几方面找: 当前 M 所绑的 P 队列找 去别的 P 的队列找 去全局 G 队列找 G任务的执行顺序是,先从本地队列找,本地没有则从全局队列找 程序启动的时候,首先跑的是主线程...,然后这个主线程会绑定第一个 P 入口 main 函数,其实是作为一个 goroutine 来执行 解答问题-① 协程的切换时间片是10ms,也就是说 goroutine 最多执行10ms就会被 M 切换到下一个...这也就直接导致了 M 最多的个数是多少,而 M 的个数就决定了各个 G 队列能同时被多少个 M 线程来进行调取执行!

1.5K10

代码写成这样,老板把开除了,最让人感到无可奈何的代码,你可千万别这么写!

这上面的活动价比原价还贵,真是哭笑不得…… 类似这样的代码,一些程序员在注释说明活动的内容,又或者是把一些生产上环境的 IP、端口、用户名、密码等敏感信息把在注释,好随时能切换…… 真是猪一样的队友...1、循环 2、线程休眠 3、多线程 还好是数字小啊,还好休眠是毫秒啊,要是数字大,要是休眠时间是秒,那要等多少休眠时间才能排序完? 按道理,他的程序也没问题啊,老板为什么要开除他?...但他这种排序思维,能写出这样的隐藏 BUG 也是绝了,创造性的发明了 "休眠排序" 算法,系统里面还不知道多少这样的坑,不开除他开除谁啊? 排序排成这样,不开除你,开除谁?...布尔值可以直接拿来用,你硬要写个三元表达式?年底绩效考核了,代码量有 KPI 么? 还有类似这样的: if (xx1 == true && xx2 != true){ ...}...就见过同事写出这样的代码,是赶时间呢,还是真的不会设计模式,一个构造函数参数能写这么多,且不说魔法值,这么长,看一眼都觉得头大。

60350

你能说出多线程 sleep、yield、join 的用法及 sleep与wait区别吗?

通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁(监视器)为中心的通信方法 除了他们之外,还有用于线程调度、控制的方法,他们是sleep、yield、join方法,他们可以用于线程的协作...扩展:多线程基础体系知识清单 对于sleep始终有一个超时时间的设置,所以,尽管他是在监视器内睡着了,但是并不会导致死锁,因为他终究是要醒来的 如下,线程休眠500毫秒,主线程50毫秒打印一次状态 ps...结论: 主线程main调用启动线程(调用start),然后调用该线程的join方法,可以达到主线程等待工作线程运行结束才执行的效果,并且join要在start调用后 如何做到的? ?...,针对当前线程,进入休眠状态,两个版本的sleep方法始终有时间参数,所以必然会在指定的时间内苏醒,他也不会释放锁,当然,sleep方法的调用非必须在同步方法(同步代码块)内 join是实例方法,表示等待谁...,被中断后都会抛出异常 wait是Object的方法,sleep是Thread的方法 wait必须在同步执行,sleep不需要(join底层依赖wait,但是不需要在同步,因为join方法就是synchronized

1.4K20

Spring Cloud Hystrix简单实用

public String queryByIdFallBack() { return "对不起,网络太过拥挤"; } } 4、配置熔断策略 常见熔断策略配置 熔断后休眠时间...hystrix.command.default.circuitBreaker.forceOpen: false # 触发熔断错误比例阈值,默认值50% hystrix.command.default.circuitBreaker.errorThresholdPercentage: 20 # 熔断后休眠时长...Hystrix会对请求情况计数,当一定时间失败请求百分比达到阈值,则触发熔断,断路器完全关闭 默认失败比例的阈值是50%,请求次数最低不少于20次 半开状态 打开状态不是永久的,打开一会后会进入休眠时间...休眠时间过后会进入半开状态。 半开状态:熔断器会判断下一次请求的返回状况,如果成功,熔断器切回关闭状态。如果失败,熔断器切回打开状态。 熔断器的核心解决方案:线程隔离和服务降级。...线程隔离。 服务降级(兜底方法) 线程隔离和服务降级之后,用户请求故障时,线程不会被阻塞,更不会无休止等待或者看到系统奔溃,至少可以看到执行结果(熔断机制)。

13520

sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十四)

)为中心的通信方法  除了他们之外,还有用于线程调度、控制的方法,他们是sleep、yield、join方法,他们可以用于线程的协作,他们是围绕着线程的调度而来的  sleep方法 有两个版本的sleep...始终有一个超时时间的设置,所以,尽管他是在监视器内睡着了,但是并不会导致死锁,因为他终究是要醒来的 如下,线程休眠500毫秒,主线程50毫秒打印一次状态 ps:sleep方法的调用结果为状态:TIMED_WAITING...结论: 主线程main调用启动线程(调用start),然后调用该线程的join方法,可以达到主线程等待工作线程运行结束才执行的效果,并且join要在start调用后 如何做到的? ?...是静态方法,针对当前线程,进入休眠状态,两个版本的sleep方法始终有时间参数,所以必然会在指定的时间内苏醒,他也不会释放锁,当然,sleep方法的调用非必须在同步方法(同步代码块)内 join是实例方法...,都是可中断方法,被中断后都会抛出异常 wait是Object的方法,sleep是Thread的方法 wait必须在同步执行,sleep不需要(join底层依赖wait,但是不需要在同步

1.5K20

SpringCloud基础教程学习记录

然后在bootstrap.yml(手动改名了2333)配置文件添加以下配置: 创建服务提供者   创建SpringBoot项目,在其主类上添加注解@EnableDiscoveryClient   ...示例:   在主类上加@EnableCircuitBreaker或@EnableHystrix注解开启Hystrix的使用:   注:这里全都用了,另外也可以使用@SpringCloudApplication...在调用的过程添加一些“必要的逻辑”(这里选择的是线程睡眠):   注:基于@HystrixCommand注解与其fallbackMethod方法实现服务降级。...第八章服务容错保护(Hystrix断路器)      在第六章,通过模拟的时间延迟实现了服务降级,但是因为超时时间的问题,仍然可能出现服务堆积的可能。   ...Hystrix实现了自动恢复功能,断路器打开,主逻辑进行熔断后,Hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑会成为临时的主逻辑;当休眠时间窗到期时,断路器会进入半开状态,释放一次请求到主逻辑上

28240

【深度】韦东山:一文看看尽linux对中断处理的前世今生

Linux系统,各种硬件中断频繁发生,至少定时器中断每10ms发生一次,那取个巧? 在处理写硬件中断后,再去处理软件中断?就这么办! 有哪些软件中断?...中断上半部、下半部的执行过程,不能休眠:中断休眠的话,以后谁来调度进程啊? 06 下半部要做的事情太多并且很复杂:工作队列 在中断下半部的执行过程,虽然是开中断的,期间可以处理各类中断。...不用我们管,schedule_work函数不仅仅是把work放入队列,还会把kworker线程唤醒。此线程抢到时间运行时,它就会从队列取出work,执行里面的函数。 d....在中断场景可以在中断上半部调用schedule_work函数。 总结: a. 很耗时的中断处理,应该放到线程里去 b. 可以使用work、work queue c....既然是在线程运行,那对应的函数可以休眠。 07 新技术:threaded irq 使用线程来处理中断,并不是什么新鲜事。

84420

万字图解Java多线程

,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道线程api的应用场景,不知道线程的运行流程等等,本篇文章将使用实例+图解+源码的方式来解析java多线程。...; try { // 休眠2秒 // 该方法会抛出 InterruptedException异常 即休眠过程可被中断,被中断后抛出异常 Thread.sleep(2000);...yield() 是 线程的礼让,使得获取到cpu时间片的线程进入就绪状态,重新争抢时间片 sleep(time) 是 线程休眠固定时间...,进入阻塞状态,休眠时间完成后重新争抢时间片,休眠可被打断 join()/join(time) 否 调用线程对象的join方法,调用者线程进入阻塞,等待线程对象执行完或者到达指定时间才恢复..., 说明还有空闲线程, if (executor.getTaskCount() < currentPoolThreadSize) { // 将任务放入队列,让线程去处理任务

47310

Java Review - 并发编程_LockSupport

线程休眠1s是为了让主线程调用unpark方法前让子线程输出child thread begin park!...thread.interrupt(); } } 在如上代码,只有中断子线程,子线程才会运行结束,如果子线程不被中断,即使你调用unpark(thread)方法子线程也不会结束。...被设置为this,这样当在打印线程堆栈排查问题时就能知道是哪个类被阻塞了。...使用带blocker参数的park方法,线程堆栈可以提供更多有关阻塞对象的信息。...然后在代码(3),判断标记,如果标记为true则中断该线程,这个怎么理解呢?其实就是其他线程中断了该线程,虽然对中断信号不感兴趣,忽略它,但是不代表其他线程对该标志不感兴趣,所以要恢复下。

38640

限流的6大狠招,附详细代码和评测结果

为了上班方便,去年把自己在北郊的房子租出去了,搬到了南郊,这样离我上班的地方就近了,它为节约了很多的时间成本,可以用它来做很多有意义的事,最起码不会因为堵车而闹心了,幸福感直线上升。...最后需要注意一下,操作系统对于进程线程数有一定的限制,Windows 每个进程线程数不允许超过 2000,Linux 每个进程线程数不允许超过 1000。...漏桶算法类似于生活的漏斗,无论上面的水流倒入漏斗有多大,也就是无论请求有多少,它都是以均匀的速度慢慢流出的。...漏桶算法的实现步骤是,先声明一个队列用来保存请求,这个队列相当于漏斗,当队列容量满了之后就放弃新来的请求,然后重新声明一个线程定期从任务队列获取一个或多个任务进行执行,这样就实现了漏桶算法。...最后我们讲了时间窗口算法借助 Redis 的有序集合可以实现,还有漏桶算法可以使用 Redis-Cell 来实现,以及令牌算法可以解决 Google 的 guava 包来实现。

49720

SpringBoot + Nacos + K8s 优雅停机

一般来说,优雅停机可以参考以下步骤以实现: 1、 备份数据:立即将内存的所有未保存的修改、缓存等数据保存到数据库或磁盘; 2、 停止接收新的请求; 3、 处理未完成的请求; 4、 通知其他依赖组件;...宽限期设置了35s,PreStop休眠了35s + 一个请求的时间,超过了宽限期,那么 kubelet 就会给与 pod 增加一次性2s的宽限时间。...所以,案例的nacos服务发现仅通过http定时轮询实现。 案例优化 上面的案例可以优化的点 nacos 反注册后休眠35s,是否可以减少?...terminationGracePeriodSeconds 设置多少合理?...优化点1 反注册后休眠的35s时候受到nacos服务发现 + ribbon 缓存刷新时间影响,正常应该是 服务发现时间 + 缓存刷新时间 40s才能在极端情况下保证服务停机时,不会再有feign 请求进入

18710

一个排序引发的惨案

据说是一个刚毕业的 Java 程序员,因老板让他写一个排序算法,然后他就写了一段屌炸天的休眠排序算法, 接着他就被老板开除了…… ? 排序算法代码大概是这样的: ? 这段代码有什么问题?...1、循环 2、线程休眠 3、多线程 ? 那么问题来了,这么牛逼首创的线程排序算法为啥还是会被开除呢? 还好是数字小啊,还好休眠是毫秒啊,要是数字大,要是休眠时间是秒,那要等多少休眠时间才能排序完?...但他这种排序思维,能写出这样的隐藏 BUG 也是绝了,创造性的发明了 "休眠排序" 算法,系统里面还不知道多少这样的坑,不开除他开除谁啊? ? 你还见过哪些奇葩的代码,说出来分享一下吧!

35340

把软萌程序猿鼓励师装进VScode里?最强交互彩虹屁,GitHub2.5k星标,爱上写代码

声音说软萌还是可以的,所以不死心的菌菌就决定看看到底有多少代码语义可以被触发。 当菌菌试了以后发现,可以实现的代码关键字还是比较有限的。...大概只有以下的关键词可以被触发: 通用组确实设置的还蛮有趣的,比如这句:"别试了,的可爱不需要用if来判断!"...还有"被await触发的别忘了给函数体加async哦,"所以说这是怕debug的时候不好找吗?hhhh fuck/shit那句太真实了,在线求:怎样才能若无其事地让产品经理听到这两句?...最后这组比较走心,都是劝休息的,就好比是屏幕定时休眠,自助护眼,这个设置挺好的,就是最后那句“如果你用了别的小姐姐的语音包,就掐死你哦!”哎呦,还真是有点害怕呢,莫非这就是传说中的奶凶奶凶的?...比如农药的瑶瑶、祖安版语音包、绝地求生版的语音包, 可以选的语音包实在是太多了。

56120

6种 分布式限流方案,替你整理好了

容器限流 Tomcat 限流 Tomcat 8.5 版本的最大线程数在 conf/server.xml 配置,如下所示: <Connector port="8080" protocol="HTTP/...最后需要注意一下,操作系统对于进程<em>中</em>的<em>线程</em>数有一定的限制,Windows 每个进程<em>中</em>的<em>线程</em>数不允许超过 2000,Linux 每个进程<em>中</em>的<em>线程</em>数不允许超过 1000。...漏桶算法类似于生活<em>中</em>的漏斗,无论上面的水流倒入漏斗有多大,也就是无论请求有<em>多少</em>,它都是以均匀的速度慢慢流出的。...漏桶算法的实现步骤是,先声明一个队列用来保存请求,这个队列相当于漏斗,当队列容量满了之后就放弃新来的请求,然后重新声明一个<em>线程</em>定期从任务队列<em>中</em>获取一个或多个任务进行执行,这样就实现了漏桶算法。...最后我们讲了<em>时间</em>窗口算法借助 Redis 的有序集合<em>可以</em>实现,<em>还有</em>漏桶算法<em>可以</em>使用 Redis-Cell 来实现,以及令牌算法<em>可以</em>解决 Google 的 guava 包来实现。

95110

JVM - 解读GC的 Safe Point & Safe Region

思考: 如上图 GC的时候,是不是可以马上GC,而不用去care用户线程 ? 答案肯定是不行的。 HotSpotGC不是在任意位置都可以进入,而只能在safepoint处进入。...简单来说 安全点就是指代码运行到这个地方,它的状态是确定的, JVM就可以安全的进行一些操作,比如GC。 所以GC不是想什么时候做就立即触发的,是需要等待所有线程运行到安全点后才能触发。...举个例子,线程休眠 Thread.sleep(100_000) 休眠100秒,要等100秒才能运行到安全区域啊 ,这可咋玩?...---- OopMap GC 我们都知道是清理那些引用不可达的对象, 简单来说 JVM怎样才能够判断出所有位置上的数据是不是指向GC堆里的引用 ?...因此,HotSpotGC不是在任意位置都可以进入,而只能在safepoint处进入。

54251
领券