Lock的lockInterruptibly()

概述

lockInterruptibly()方法比较特殊,当通过这个方法去获取锁时,如果其他线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。

注意是:等待的那个线程B可以被中断,不是正在执行的A线程被中断


代码

有关线程中断的请见:http://blog.csdn.net/zengmingen/article/details/53259966

BussinessClass 业务类代码
package multithreading.lock;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class BussinessClass {private Lock lock = new ReentrantLock();// 业务方法public void bFuction() {String tName = Thread.currentThread().getName();try {System.out.println(tName + "-开始获取锁..........");lock.lockInterruptibly();System.out.println(tName + "-获取到锁了!!!!");System.out.println(tName + "-睡觉了,睡个30秒!");Thread.sleep(30000);System.out.println(tName + "-睡醒了,干活!");for (int i = 0; i < 5; i++) {System.out.println(tName + ":" + i);}} catch (Exception e) {System.out.println(tName+"-我好像被中断了!");e.printStackTrace();}finally{lock.unlock();System.out.println(tName + "-释放了锁");}}}

测试类

package multithreading.lock;import org.junit.Test;public class TestInterruptibly {@Testpublic void testInterruptibly() throws Exception{BussinessClass bc=new BussinessClass();Thread t0=new Thread(){@Overridepublic void run() {bc.bFuction();}};Thread t1=new Thread(){@Overridepublic void run() {bc.bFuction();}};String tName=Thread.currentThread().getName();System.out.println(tName+"-启动t0!");t0.start();System.out.println(tName+"-我等个5秒,再启动t1");Thread.sleep(5000);System.out.println(tName+"-启动t1");t1.start();System.out.println(tName+"-t1获取不到锁,t0这货睡觉了,没释放,我等个5秒!");Thread.sleep(5000);System.out.println(tName+"-等了5秒了,不等了,把t1中断了!");t1.interrupt();Thread.sleep(Long.MAX_VALUE);}}

运行结果

main-启动t0!
main-我等个5秒,再启动t1
Thread-0-开始获取锁..........
Thread-0-获取到锁了!!!!
Thread-0-睡觉了,睡个30秒!
main-启动t1
main-t1获取不到锁,t0这货睡觉了,没释放,我等个5秒!
Thread-1-开始获取锁..........
main-等了5秒了,不等了,把t1中断了!
java.lang.InterruptedException
Thread-1-我好像被中断了!
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(Unknown Source)
at multithreading.lock.BussinessClass.bFuction(BussinessClass.java:15)
at multithreading.lock.TestInterruptibly$2.run(TestInterruptibly.java:23)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source)
at multithreading.lock.BussinessClass.bFuction(BussinessClass.java:28)
at multithreading.lock.TestInterruptibly$2.run(TestInterruptibly.java:23)
Thread-0-睡醒了,干活!
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0-释放了锁


-------------

更多的Java,Angular,Android,大数据,J2EE,Python,数据库,Linux,Java架构师,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html



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

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

相关文章

python中把输出结果写到一个文件中_Python3.6笔记之将程序运行结果输出到文件的方法...

Python3.6笔记之将程序运行结果输出到文件的方法 更新时间&#xff1a;2018年04月22日 14:27:32 投稿&#xff1a;jingxian 下面小编就为大家分享一篇Python3.6笔记之将程序运行结果输出到文件的方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起跟随小…

hangfire.mysql.core_abp 使用 hangfire结合mysql

abp 官方使用的hangfire 默认使用的是sqlserver的存储mysql须要引入支持mysql的类库sql我这边使用的是Hangfire.MySql.Core数据库直接用nuget安装便可app首先按照官方文档要求&#xff0c;改几个地方sqlserver分别是 Startup 文件下serverservices.AddHangfire(config >{con…

python 图标题上移_Python-Matplotlib将图形标题移动到y轴

我目前在python中使用matplotlib来绘制一些数据,但是我希望图表的标题位于Y轴上,因为没有足够的空间来存储一个图形的标题和另一个图形的x轴标签.我知道我可以将hspace设置为更大的数字但是,我不想这样做,因为我计划将几个图表堆叠在一起,如果我调整hspace,那么图表将是真的简短…

solr的基础使用

查询运算符 例如&#xff1a;http://localhost:8984/solr/mycore/select?q*:* : 指定字段查指定值&#xff0c;如返回所有值q*:* ? 匹配单个字符&#xff0c; 例如: qtitle:??拳 可以匹配标题为“形意拳”的文档 * 匹配零个或多个字符, 例如: qtitle:*形意拳 或者 qtitl…

同步关键词lock

概述 1、API在JDK的java.util.concurrent.locks下。 2、不是Java关键字&#xff0c;是接口。 3、ReentrantLock是JDK唯一实现了Lock接口的类。 public interface Lock {//获取锁void lock();//可以响应中断的锁void lockInterruptibly() throws InterruptedException;//尝试…

Java bitset转string_将java BitSet保存到DB

默认情况下,JPA使用Java序列化来保存未知Serializable类型的属性(以便将序列化表示存储为byte []).通常它不是您想要的,因为可以有更有效的方式来表示您的数据.例如,BitSet可以有效地表示为数字(如果它的大小有界),或者byte [],或其他东西(遗憾的是,BitSet不提供进行这些转换的…

python读取raw图片文件_在python下读取并展示raw格式的图片实例

raw文件可能有些人没有&#xff0c;因此&#xff0c;先用一张图片创建一个raw格式的文件&#xff08;其实可以是其他类型的格式文件&#xff09; import numpy as np import cv2 img cv2.imread(cat.jpg) # 这里需要我们在当前目录下放一张名为cat.jpg的文件 img.tofile(cat.r…

python怎么网络通信_深入Python中的网络通信

TCP/IP计算机与网络设备两情侣要谈恋爱&#xff0c;相互通信&#xff0c;那么双方就必须有规则。基于相同的方法&#xff0c;不同的硬件、操作系统之间的通信&#xff0c;都需要一种规则。而我们就把这种规则称为协议(protocol)。TCP/IP 是互联网相关各类协议族的总称。TCP/IP是…

ReadWriteLock读写文件

概述 ReadWriteLock是一个接口&#xff0c;在它里面只定义了两个方法&#xff1a;一个读的锁和一个写的锁。 读的锁&#xff1a;A线程获取了读的锁&#xff0c;那么B线程也可以获取读的锁。 写的锁&#xff1a;A线程获取了写的锁&#xff0c;那么B线程不能获取读也不能获取写…

搞懂 Java HashMap 源码

HashMap 源码分析 前几篇分析了 ArrayList &#xff0c; LinkedList &#xff0c;Vector &#xff0c;Stack List 集合的源码&#xff0c;Java 容器除了包含 List 集合外还包含着 Set 和 Map 两个重要的集合类型。而 HashMap 则是最具有代表性的&#xff0c;也是我们最常使用到…

python 怎么表示sqlserver null_如何使用Python将sqlserver查询输出写入.txt文件?

我是Python新手&#xff0c;尝试连接到sqlserverdb并将查询的输出转换成一个flat.txt文件。在一些代码正在工作&#xff0c;但是只写了将近1000条记录&#xff0c;然后就停止了。在Python版本&#xff1a;2.7.13。在下面的代码能够把100万条记录全部写入csv文件而不是.txt文件&…

python中object是什么类型_Python 的 type 和 object 之间是怎么一种关系?

class&#xff0c;metaclass&#xff0c;instance&#xff0c;subclass&#xff0c;base 以下成立&#xff1a; 对任意的A&#xff0c;A是instance&#xff08;推论&#xff1a;任意class也是instance&#xff09; 对任意A&#xff0c;存在B&#xff0c;使得B是A的class A是cla…

java8新生代_jdk8.0的jvm详情

jstat命令可以查看堆内存各部分的使用量&#xff0c;以及加载类的数量。命令的格式如下&#xff1a;jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意&#xff1a;使用的jdk版本是jdk8.[work16-11-118qf-pms]$ jstat -class 32417Loaded?? Bytes?? Unloaded?? B…

Java中的Runnable、Callable、Future、FutureTask的区别与示例

原文地址&#xff1a;http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------------------------- Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口&#xff0c;在Java中也是比较重要的几个概念&am…

sql count为空时显示0_C0010负坐标显示为正数+红色0值参考线

小伙伴们早上好啊&#xff01;今天继续为大家分享柱形图的美化技巧。希望大家认真阅读Excel文件和教程&#xff0c;有的图表看起来简单&#xff0c;实际上在细节处理上用了很多技巧&#xff0c;大家要多多体会。C0010-负坐标显示为正数红色0值参考线效果图图表概述本图可以用来…

配置IISExpress允许外部访问

配置IISExpress允许外部访问 1.找到IISExpress的配置文件&#xff0c;位于 <文档>/IISExpress/config文件夹下&#xff0c;打开applicationhost.config&#xff0c;找到如下代码&#xff1a;<site name"WebSite1" id"1" serverAutoStart"tru…

python布尔测试对象_python布尔类型和逻辑运算

布尔类型 python中True表示真&#xff0c;False表示假&#xff0c;它们是布尔类型&#xff1a;1 2>>> type(True) 在python中&#xff0c;bool的True和False是数值1和0的字符串表示格式&#xff0c;实际上bool类型是int类型的一个子类。1 2>>> bool.__bases_…

mac预装的php路径,Mac使用系统自带php和Apache

最美的语言本文将介绍在Mac环境下如何使用系统本身所带有的Apache(阿帕奇服务器)通过预装的PHP版本来运行PHP的相关代码&#xff0c;相对来讲在OS X系统下相对好配置一些&#xff0c;因为Apache和PHP都预装好了&#xff0c;如果是Windows环境我们需要自己安装ApachePHPMysql(通…

线程池与Callable更配哦

概述 Callable介绍见&#xff1a;http://blog.csdn.net/zengmingen/article/details/53288119 多线程介绍见&#xff1a;http://blog.csdn.net/zengmingen/article/details/53284999 代码 TaskCallable.javapackage multithreading.pool;import java.util.concurrent.Callabl…

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…