博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍
阅读量:5037 次
发布时间:2019-06-12

本文共 5007 字,大约阅读时间需要 16 分钟。

在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);    }}

执行结果为:

 

 

转载于:https://www.cnblogs.com/chaiyesong/p/6612292.html

你可能感兴趣的文章
.net core 发布到docker
查看>>
web移动端浮层滚动阻止window窗体滚动JS/CSS处理
查看>>
字符串匹配的KMP算法-16张图片看明白
查看>>
[机器学习]回归--Support Vector Regression(SVR)
查看>>
hdoj_3476Cyclic Nacklace
查看>>
2019-05-23 奇虎ARP防火墙
查看>>
Linux内核同步机制之信号量与锁
查看>>
KafkaSpout的处理流程
查看>>
20162312 第十周学习总结
查看>>
POJ 3691 TRIE图+DP
查看>>
ES6初体验——(1)let和const命令
查看>>
for循环与forEach性能思考
查看>>
sys模块的初步认识
查看>>
多核cpu电脑运行多线程程序的问题
查看>>
创建带输入参数的存储过程
查看>>
正则 re
查看>>
线性规划与单纯形法学习笔记
查看>>
设计模式之-模版方法(Template Method Design Pattern)
查看>>
HTTPS Everywhere – 保障隐私和信息安全的利器
查看>>
A380上11万一张的机票什么享受?来看看
查看>>