java中的locksupport_java中线程的停止以及LockSupport工具类

看jstack输出的时候,可以发现很多状态都是TIMED_WAITING(parking),如下所示:

"http-bio-8080-exec-16" #70 daemon prio=5 os_prio=0 tid=0x00007f6088027800 nid=0x3a1f waiting on condition [0x00007f60fcd03000]

java.lang.Thread.State: TIMED_WAITING (parking)

at sun.misc.Unsafe.park(Native Method)

- parking to wait for <0x00000006cb8d7500> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)

at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)

at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)

at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86)

at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32)

at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

关于LockSupport,查看相关资料,可知LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数:

public native void unpark(Thread jthread);

public native void park(boolean isAbsolute, long time);

isAbsolute参数是指明时间是绝对的,还是相对的。

仅仅两个简单的接口,就为上层提供了强大的同步原语。

先来解析下两个函数是做什么的。

unpark函数为线程提供“许可(permit)”,线程调用park函数则等待“许可”。这个有点像信号量,但是这个“许可”是不能叠加的,“许可”是一次性的。

比如线程B连续调用了三次unpark函数,当线程A调用park函数就使用掉这个“许可”,如果线程A再次调用park,则进入等待状态。

注意,unpark函数可以先于park调用。比如线程B调用unpark函数,给线程A发了一个“许可”,那么当线程A调用park时,它发现已经有“许可”了,那么它会马上再继续运行。

在JDK 5里面,是用wait/notify/notifyAll来同步的,它没有LockSupport那样的容忍性,所以JDK7 JUC之后几乎都是采用park与unpark实现。 至于其提供的额外监视器参数,主要是jstack排查方便。

我们知道,线程的shutdown从标准的角度来说,就是给线程发送一个interupt,线程自行决定是否响应,具体是否相应的标准如下:

interrupt

public void interrupt()

Interrupts this thread.

Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.

If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException. (这是正确而且必须的行为,否则就有可能会导致共享变量处于不一致的状态)

If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.

If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.

If none of the previous conditions hold then this thread's interrupt status will be set.

Interrupting a thread that is not alive need not have any effect.

Throws:

所以,对于那些无法响应中断的线程中的逻辑,我们需要根据isInterupted来判断决定是否终止自己,不过不可否认的是,现实中有很多的应用并没有这么做。关于对中断的处理方式,可参考Java theory and practice: Dealing with InterruptedException 。

最后看一下,对于那些使用park阻塞的线程,是否支持Interrupt,看javadoc是支持的,如下:

a9ef24259ec6bae5800673eae510d790.png

关于java中断,讲得比较好的帖子是:

http://agapple.iteye.com/blog/970055

关于LockSupport,可参见:

http://blog.csdn.net/hengyunabc/article/details/28126139

以及java doc参考https://docs.oracle.com/javase/7/docs/api/.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入react技术栈(8):事件系统

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号搜索前端小歌谣获取前端知识 1合成事件的绑定方式 2合成事件的实现机制 3在React中使用原生事件 4合成事件和原生事件混用 5对比react与原生事件 文章参考深入React技术栈

java mac jconsole_解决java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包问题

今天遇到了这样一种情况&#xff0c;自己的maven项目中并没有引用的jar包出现在了Maven Dependencies的依赖包中。而我在pom.xml自己没有没有引入啊.图示怀疑是自己的alibaba 的druid所依赖的包&#xff1a;com.alibabadruid1.0.14然后查看了它的相关依赖&#xff0c;果然找到了…

PyRun_SimpleString的无穷怨念

From: http://blog.csdn.net/ccat/article/details/544491 好吧&#xff0c;我承认我是个菜鸟&#xff0c;所以今天我勇敢的站出来接受大家的鄙视…… 话说早上同事喊我帮他改段程序&#xff0c;很简单&#xff0c;就是用PyRun_SimpleString函数执行一段Python脚本。错误也很直…

cisco 交换机vlan-trunk的配置详解及应用实例:

虚拟局域网&#xff08;vlan&#xff09;&#xff1a;主要是为了分割广播域注&#xff1a;不同vlan之间不能相互通信。trunk&#xff1a;主要是为了不同交换机的相同vlan相互通信配置静态VLAN的步骤:************************************1.创建VLAN1)VLAN数据库配置模式:Switc…

java 登录拦截器_springMVC 拦截器-用户登录拦截实战

各位小伙伴咱们继续学习新知识今天要分享的就是拦截器不知道小伙伴们平时上网的时候有没有注意到,尤其是上网购物的时候,不登录账号,就无法访问一些功能页面,比如你不登录账号,就没法查看购物车里面有什么物品.这就是拦截器起到的作用.那么今天我们就来给之前的项目添加一个拦截…

java和node.js 2018_node.js在2018年能继续火起来吗?我们来看看node.js的待遇情况

你知道node.js是怎么火起来的吗&#xff1f;你知道node.js现在的平均工资是多少吗&#xff1f;你知道node.js在2018年还能继续火吗&#xff1f;都不知道&#xff1f;那就来看文章吧&#xff0c;多学点node.js&#xff0c;说不定以后的你工资就会高于nodejs的平均工资了&#xf…

Android教程之android平台水波效果!提供源码!

基于Android平台实现的水波效果&#xff0c;提供源码&#xff0c;&#xff0c;效果图如下&#xff1a;

利用HttpSessionListener实现网站在线人数统计功能

为什么80%的码农都做不了架构师&#xff1f;>>> 在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能&#xff0c;即当用户输入用户名密码进行登录的时候计数器加1&#xff0c;然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存…

深入react技术栈(9):表单

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号搜索前端小歌谣 获取前端知识 应用表单组件 文本框 单选按钮和复选框 Select组件 文章参考深入react技术栈

JAVA翻译官_Java开发笔记(三)Java帝国的特种官吏

上一篇文章介绍了Java工程的帝国区划&#xff0c;末尾给出了一段Java代码例子&#xff0c;这个代码虽然勉强能看懂&#xff0c;但是有些细节令人不甚了了。比如说“// 参观朱雀台”为何能够直接跟在当前行后面&#xff1f;“System.out.println”又为何被点号绕了三道湾&#x…

深入react技术栈(10):受控组件和非受控组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 受控组件 非受控组件 受控组件和非受控组件的区别 文章参考深入React技术栈