需要手动释放锁
boolean lock.tryLock(long time, TimeUtil util); 尝试申请锁并持续 time , 申请到返回 true
void lock.lockInterruptibly() throws InterruptedException; 持续申请锁,效果等同与lock.lock(),但是lockInterruptibly() 可以在主线程取消等待,取消等待后会抛出异常。
package com.iweb;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by zh on 2019/4/29.
*/
public class Rep {
Lock lock = new ReentrantLock();
volatile boolean stop = false;
// 通过 lock 申请锁
private void t1() {
lock.lock();
try {
while(!stop) {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// 通过 lockInterruptibly 申请锁
private void t2() {
boolean l = false;
try {
lock.lockInterruptibly();
l = true;
while(!stop) {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName());
}
System.out.println(Thread.currentThread().getName() + " end");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (l)
lock.unlock();
}
}
public static void main(String[] args) {
Rep r = new Rep();
Thread t1 = new Thread(()->r.t1(), "t1");
t1.start();
Thread t2 = new Thread(()->r.t2(), "t2");
t2.start();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.interrupt(); // 停止t2持续申请但 会抛异常
r.stop = true;
}
}
运行结果