您的位置 首页 java

java中ReentrantLock类的tryLock和tryLock的例子和用法

Reentrant lock 类的tryLock和tryLock(时间)
马克-to-win:tryLock的方法就是试一下,如果能得到锁,就返回真,如果当时得不到,马上就返回假,绝不等。tryLock(时间)的用法就是在规定的时间内设法得到锁。如果在规定的时间内最终不能得到锁,就返回假。注意,这个方法是可以被打断的,打断后的处理方法和上面的例子 lockInterruptibly的处理一样。马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。

例1.9.8_a:
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
class A {
private ReentrantLock lock = new ReentrantLock();
int ticketNum = 10;
public void buyOne() {
System.out.println(“just before lock.lockInterruptibly();”);
boolean succeed = lock.tryLock();
if (succeed) {
System.out.println(Thread.currentThread().getName()
+ “ticketNum is” + ticketNum);
if (ticketNum > 0) {
try {
Thread.sleep(5000);
} catch (Interrupted Exception e) {
e.printStackTrace();
}
ticketNum–;
System.out
.println(“模仿select * from table for update,执行的很慢,买了一张”
+ Thread.currentThread().getName()
+ “ticketNum is” + ticketNum);
}
lock.unlock();
}else{
System.out.println(“没获得锁,一张”);
}
}

public void buyBatch(int num) throws InterruptedException {
System.out.println(“just before lock.lockInterruptibly();”);
boolean succeed = false;
boolean sleepSucceed = false;
succeed = lock.tryLock(2, TimeUnit.SECONDS);
if (succeed) {
System.out.println(“Thread.currentThread().getName()+ticketNum is”
+ ticketNum);
try {
Thread.sleep(5000);
sleepSucceed=true;
} catch (InterruptedException e) {
System.out.println(“已经获得了锁了,几张的睡觉被打断,表示预备工作没做好,什么也不买”);
}

if (ticketNum >= num&&sleepSucceed) {
ticketNum = ticketNum – num;
System.out
.println(“模仿select * from table for update,执行的很慢,买了几张”
+ Thread.currentThread().getName()
+ “ticketNum is” + ticketNum);
}
lock.unlock();
}else{
System.out.println(“没获得锁,几张”);
}
}
}

class MyThread1 extends Thread {
A a;
public MyThread1(A a) {
this.a = a;
}
public void run() {
a.buyOne();
}
}

class MyThread2 extends Thread {
A a;
public MyThread2(A a) {
this.a = a;
}
public void run() {
try {
a.buyBatch(3);
} catch (InterruptedException e) {
System.out.println(“正要获得锁的过程当中呢,几张的线程被打断”);
}
}
}
public class Test Mark_to_win {
public static void main(String[] args) throws InterruptedException {
MyThread1[] threads = new MyThread1[2];
A a = new A();
for (int i = 0; i < 2; i++) {
threads[i] = new MyThread1(a);
}
MyThread2 myThread2 = new MyThread2(a);
Thread s[0].start();
Thread.sleep(50);
myThread2.start();
threads[1].start();
// Thread.sleep(50);
// myThread2.interrupt();
}
}

篇幅有限更多请见扩展链接:

文章来源:智云一二三科技

文章标题:java中ReentrantLock类的tryLock和tryLock的例子和用法

文章地址:https://www.zhihuclub.com/187957.shtml

关于作者: 智云科技

热门文章

网站地图