揭开Java线程中断的秘密

点击↑上方↑蓝色“编了个程”关注我~

每周至少一篇原创文章

这是本公众号的第 23 篇原创文章

荒腔走板

也学学why哥,在每篇文章加一段荒腔走板的内容。也就是随便聊聊,可能是自己近期的生活状态或者感悟,一些想法和思考,也可能是写这篇文章的初衷等等,甚至只是随便吹吹牛。

最近可能由于工作压力有点大,所以老是感觉不是很开心,前几天还在朋友圈吐槽了一下,看到很多朋友的鼓励,很感动。

其实想一想自己这二十几年来也算挺幸运的,家庭和睦,感情顺利,学业也还马马虎虎过得去,工作虽然跳了几次槽,但也还算顺利。虽名下无车无房无孩子,但也算过得不错,超市自由还是有的。其实没必要抱怨太多,父母那一代人比我们不容易太多了,我们所谓的“吃苦”根本不算什么。

进大厂也是自己的选择,努力加油啦。

今天一上午去西湖走了一圈,晚上回来吃了一顿家人做的大餐,然后去外面朋友教我学滑板,又Get了一项新技能。晚上10点回来继续写文章,差不多写到12点半(远远晚于自己的预期),可能真的要秃了。实在是越写越多,控制不住。。。

周末的一天

「生活就是这样,你只有尝试去热爱,才能真正收获快乐。」

再说回为什么要写这篇文章。其实周五选题的时候纠结了一下,本来想写Spring Ioc的,它的受众面可能会广一点,但是看了一下,源码还蛮复杂的,感觉也要花比较大的篇幅去理顺,后面在看吧。各位读者朋友也可以尽管留言,你们想看哪方面的文章,给我点灵感。

线程中断这个idea是前段时间我们多线程电子书的读者群里,菠萝问的提一个关于AQS的疑问,然后我们在群里简单讨论了一下,得出了一些初步的答案。

讨论线程中断

但下来后,自己又想彻底理清楚线程中断的机制,之前写多线程书的时候,并没有很注重这一部分。网上关于线程中断的文章其实并不多,希望这篇文章能够对大家有所帮助。

线程中断的使用场景

线程中断,指的是我们希望关闭一个线程。

那什么时候会需要用到线程中断呢?举个例子,我们在打滴滴的时候,通常可以选多个车型。而如果一旦某个车型打到了,就会取消掉其它所有的打车。

再比如我们去请求一个第三方的API,我们希望在限定的时间内得到结果,如果得不到,我们会希望取消该任务。

类似的例子还有很多,凡是我们需要中断另一个线程正在做的事,就可以用线程中断来帮我们实现。

Java的各种线程工具类也广泛使用了线程中断的机制。

抢占式和协作式中断

历史上Java曾经使用stop()方法终止线程的运行,他们属于「抢占式中断」。但它引来了很多问题,早已被JDK弃用。使用stop()方法可能会带来数据不一致的问题,甚至可能根本不能停止线程。

有兴趣的同学可以看官方的这篇文章:https://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

经历了很长时间的发展,Java最终选择了用一种「协作式」的中断机制来实现中断,也就是现在的实现。

所谓协作式,是通过一个中断标识位来实现的。其它线程如果想要中断线程A,就对线程A的中断标识位做一个标记,线程A自己通过「轮询」去检查标识位,然后自己做处理。

那么问题来了,这个标识位在哪里?如何轮询的呢?线程轮询到中断会做什么呢?这几个问题会在后面具体介绍,这里先做一个简单的解释。

Java中线程中断的标识位是由「本地方法」维护的&

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值