java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍
在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行,否则出现死锁现象。
lockInterruptibly()方法介绍:
此方法返回的为获取锁的方法,但是当线程调用了interrupt()方法后,此方法将会返回一个异常,导致线程的中断。即线程中断。
代码实例如下:
package TestThread.ThreadLockDemo;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();// 初始化lock对象
Test2 test2 = new Test2("苹果", 100);// 初始化苹果的数量
Test1 test1 = new Test1(lock, 10, test2);// 初始化线程对象
Thread t1 = new Thread(test1, "线程1");// 创建线程
Thread t2 = new Thread(test1, "线程2");
Thread t3 = new Thread(test1, "线程3");
Thread t4 = new Thread(test1, "线程4");
Thread t5 = new Thread(test1, "线程5");
// t1.start();// 启动线程
t2.start();
t4.start();
t5.start();
t4.interrupt();
t3.start();
}
}
class Test1 implements Runnable {
private int count;
private ReentrantLock lock;
private Test2 test2;
public Test1(ReentrantLock lock, int count, Test2 test2) {
this.lock = lock;
this.count = count;
this.test2 = test2;
}
@Override
public void run() {
// try {
// lock.lock();
// Thread.sleep(1);
// System.out.println(Thread.currentThread().getName() + ":开锁成功");
// } catch (InterruptedException e) {
// e.printStackTrace();
// } finally {
// lock.unlock();
// System.out.println(Thread.currentThread().getName() + ":闭锁成功");
// }
// lock.tryLock()测试
// if (lock.tryLock()) {
// try {
// // Thread.sleep(1000);
// System.out.println(Thread.currentThread().getName() + ":当前线程已经开启锁!");
// } catch (Exception e) {
// System.out.println(Thread.currentThread().getName() + ":当前线程中断了!");
// } finally {
// lock.unlock();
// System.out.println(Thread.currentThread().getName() + ":释放锁成功!");
// }
// } else {
// System.out.println(Thread.currentThread().getName() + ":未获取到锁!");
// }
try {
lock.lockInterruptibly();
try {
System.out.println(Thread.currentThread().getName() + ":当前线程获取线程锁!");
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + ":当前线程发生系统异常!");
} finally {
lock.unlock();
System.out.println(Thread.currentThread().getName() + ":释放锁成功!");
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + ":当前线程中断!");
}
}
}
class Test2 {
private String name;
int count;
/**
* @param name苹果的名字
* @param count初始化苹果的数量
*/
public Test2(String name, int count) {
this.name = name;
this.count = count;
}
/**
* * @author 作者 E-mail:
*
* @date 创建时间:2017年3月24日 下午1:13:14
* @version 1.0
* @parameter
* @since
* @return
*/
public void DiscountApple(int discount) {
this.count = this.count - discount;
System.out.println(Thread.currentThread().getName() + ":苹果的数量为:" + this.count + ",卖掉了" + discount);
}
}
运行结果如下:

更新代码如下:
package TestThread.ThreadLockDemo;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();// 初始化lock对象
Test2 test2 = new Test2("苹果", 100);// 初始化苹果的数量
Test1 test1 = new Test1(lock, 10, test2);// 初始化线程对象
Thread t1 = new Thread(test1, "线程1");// 创建线程
Thread t2 = new Thread(test1, "线程2");
Thread t3 = new Thread(test1, "线程3");
Thread t4 = new Thread(test1, "线程4");
Thread t5 = new Thread(test1, "线程5");
Thread t6 = new Thread(test1, "线程6");
// t1.start();// 启动线程
t2.start();
t4.start();
t5.start();
t4.interrupt();
t3.start();
t6.start();
}
}
class Test1 implements Runnable {
private int count;
private ReentrantLock lock;
private Test2 test2;
public Test1(ReentrantLock lock, int count, Test2 test2) {
this.lock = lock;
this.count = count;
this.test2 = test2;
}
@Override
public void run() {
try {
lock.lockInterruptibly();
try {
Thread.sleep(1000);
test2.DiscountApple(count);
// Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + ":当前线程发生系统异常!");
} finally {
lock.unlock();
System.out.println(Thread.currentThread().getName() + ":释放锁成功!");
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + ":当前线程中断!");
}
}
}
class Test2 {
private String name;
int count;
/**
* @param name苹果的名字
* @param count初始化苹果的数量
*/
public Test2(String name, int count) {
this.name = name;
this.count = count;
}
/**
* * @author 作者 E-mail:
*
* @date 创建时间:2017年3月24日 下午1:13:14
* @version 1.0
* @parameter
* @since
* @return
*/
public void DiscountApple(int discount) {
this.count = this.count - discount;
System.out.println(Thread.currentThread().getName() + ":苹果的数量为:" + this.count + ",卖掉了" + discount);
}
}
执行结果为:

java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍的更多相关文章
- java中的 java.util.concurrent.locks.ReentrantLock类的使用方式
实现了lock的类为:ReentrantLock 接口的方式解释: lock()方法为获取锁对象,如果未获取到锁就一直获取锁. trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回 ...
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
看API文档介绍几个方法: JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock 2.接口Conditio ...
- 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock
JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...
- Synchronized和java.util.concurrent.locks.Lockde区别联系
1.Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用 ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...
- 简述synchronized和java.util.concurrent.locks.Lock异同
主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...
- Java并发—java.util.concurrent.locks包
一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当 ...
- synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...
- 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放
一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, A ...
随机推荐
- inpu控件接受pipe的处理结果
input控件绑定的变量,要接受用户的输入值,一般只要使用 [(ngModel)] 就可以. 但是,pipe处理结果如何反映到变量里去呢?不知道吧?嘿嘿 这样就可以了 : <input ...
- 浏览器端时间循环与nodejs端时间循环的不同之处(宏任务与微任务)
浏览器端与node端都有宏任务与微任务的概念.字面意思上看宏任务就是耗时间比较长的任务,而微任务是耗时短的任务. 在浏览器端,宏任务包括setTimeout,setInterval,微任务则包括Pro ...
- 贝叶斯公式与最大后验估计(MAP)
1, 频率派思想 频率派思想认为概率乃事情发生的频率,概率是一固定常量,是固定不变的 2, 最大似然估计 假设有100个水果由苹果和梨混在一起,具体分配比例未知,于是你去随机抽取10次,抽到苹果标记为 ...
- 使用pip安装包提示TLS证书错误解决办法
最近有在使用pip安装python包的时候,总会出现以下类似的错误: Could not fetch URL https://pypi.python.org/simple/pytest-xdist/: ...
- python学习Day11 函数的参数列表
复习 什么是函数? 具体特定功能的代码块 - 特定功能代码作为一个整体,并给该整体命名,就是函数 函数的优点 : 1.减少代码的冗余,2.结构清晰,可读性强 3.具有复用性,开发效率高,维护成本高 如 ...
- 一条分页的SQL语句
1.概述 在网页中如果显示的数据太多就会占据过多的页面,而且显示速度也会很慢.为了控制每次在页面上显示数据的数量,就可以利用分页来显示数据. 2.技术要点 在SQL Server中要实现SQL分页,需 ...
- 云主机中毒 cpu爆满解决日志
在上一篇博文Linux系统发现占用CPU达100%的进程并处理 里面以为已经把挖矿程序sustse处理干净了,可是没过两天又收到阿里云短信提醒,说服务器有问题,难道还有后门吗?也多亏阿里云给出提示“出 ...
- 云笔记项目-Spring事务学习-传播MANDATORY
接下来测试事务传播属性MANDATORY Service层 所有Service层实现类都设置事务传播属性为MANDATORY. LayerT层代码 package LayerT; import jav ...
- P3865 【模板】ST表
P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数 ...
- python jieba 库分词结合Wordcloud词云统计
import jieba jieba.add_word("福军") jieba.add_word("少安") excludes={"一个", ...