在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()方法介绍的更多相关文章

  1. java中的 java.util.concurrent.locks.ReentrantLock类的使用方式

    实现了lock的类为:ReentrantLock 接口的方式解释: lock()方法为获取锁对象,如果未获取到锁就一直获取锁. trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回 ...

  2. java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解

    看API文档介绍几个方法:  JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock                    2.接口Conditio ...

  3. 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock

    JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...

  4. Synchronized和java.util.concurrent.locks.Lockde区别联系

    1.Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用 ...

  5. 简述synchronized和java.util.concurrent.locks.Lock的异同?

    主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...

  6. 简述synchronized和java.util.concurrent.locks.Lock异同

    主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...

  7. Java并发—java.util.concurrent.locks包

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当 ...

  8. synchronized 和 java.util.concurrent.locks.Lock 的异同 ?

    主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...

  9. 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放

    一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, A ...

随机推荐

  1. Spring使用Quartz定时调度Job无法Autowired注入Service的解决方案

    1)自定义JobFactory,通过spring的AutowireCapableBeanFactory进行注入,例如: public class MyJobFactory extends  org.s ...

  2. void类型及void指针(转载)

    转载 https://www.cnblogs.com/pengyingh/articles/2407267.html 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针” ...

  3. PHP+Ajax实现文件上传功能

    前端显示界面: 1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. python之路:模块初识

    python王者开发之路:模块初识 模块初识我现在讲的确有点早.不过没关系,后面我会详细说模块. 模块,也就是库,是python三剑客之一.这三剑客,函数.库和类,都是由程序编写而成的.之所以我先说模 ...

  5. 把一个syn报文给rst掉

    下面展示一个极其简单的例子,看如何使用netfilter来将一个指定端口的syn报文给rst掉. //************************************************* ...

  6. Mac gitk安装与优化

    一.mac系统安装gitk gitk是git的一个bin工具,如果git不包含gitk只能说明当前使用的git版本过老. 因此我们只需要安装最新的git就可以了.安装git方法如下: 首先安装brew ...

  7. https://github.com/gaoyangxiaozhu/DockerVI

    [更新]分享一个开源项目DockerVI,一个基于NodeJS实现的Docker Swarm可视化解决方案

  8. 安装oracle [INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突” 的问题

    删除C:\Program Files (x86)\Oracle\Inventory\下的Oracle文件夹即可解决问题

  9. 拦截过滤防御XSS攻击 -- Struts2.3 以及 2.5 的解决方式

    使用Struts2框架开发的后台在防御XSS攻击的时候很多方式都不能用,因为Struts2对请求进行的二次封装有区别.以下针对Struts2的XSS攻击进行拦截过滤防御解决: Struts2.3 本方 ...

  10. c++ vector push_back对象的时候存起来的是拷贝

    比如 class C1; vector<C1> vec;C1* p=new C1;vec v1;v1.push_back(&(*p));delete p; 这里,传进函数的是引用, ...