tryLock()主要用法如下
以下為虛擬代碼:
boolean isLock = tryLock();
if(isLock ){
你要處理的程式
}
if(isLock ){
unlock()
}
lockInterruptibly() 與 lock()差異
lockInterruptibly 當執行緒有interrupt()時,呼叫lockInterruptibly()就會拋出InterruptedException
lock() 當執行緒有interrupt()時,不會拋出InterruptedException,等到取得鎖後將Thread狀態改為InterruptedException
程式碼如下:
public class TTTT {
public static void main(String[] args){
Thread i1 = new Thread(new RunIt1());
Thread i2 = new Thread(new RunIt2());
i1.setPriority(Thread.MAX_PRIORITY);
i1.setName("Thread1");
i2.setName("Thread2");
i1.start();
i2.start();
// i1.interrupt();
}
}
class TestX2{
private static Lock lock1 = new ReentrantLock();
public static void addX() throws InterruptedException{
boolean itTryLock = true;
try{
System.out.println("Thread addX Name 1:"+Thread.currentThread().getName());
itTryLock = lock1.tryLock();//鎖定區塊
System.out.println("Thread addX Name in lock block:"+Thread.currentThread().getName());
TimeUnit.SECONDS.sleep(5);
}finally{
if(itTryLock){
lock1.unlock(); //解鎖
}
System.out.println("Thread addX Name 2 UNLock:"+Thread.currentThread().getName());
}
}
public static void delX() throws InterruptedException{
boolean itTryLock = true;
try{
TimeUnit.SECONDS.sleep(1);
System.out.println("Thread Name delX 1:"+Thread.currentThread().getName());
itTryLock = lock1.tryLock();//鎖定區塊
System.out.println("Thread Name delX in lock block:"+Thread.currentThread().getName());
System.out.println("Thread Name delX 2:"+Thread.currentThread().getName());
}finally{
if(itTryLock){
lock1.unlock();//解鎖
}
}
}
}
class RunIt1 implements Runnable{
public void run(){
try{
System.out.println("RunIt1....:Start");
TestX2.addX();
}
catch (InterruptedException e){
System.out.println(Thread.currentThread().getName() + " interrupted");
}
}
}
class RunIt2 implements Runnable{
@Override
public void run() {
System.out.println("RunIt2....:Start");
// TODO Auto-generated method stub
try {
TestX2.delX();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
RunIt1....:Start
RunIt2....:Start
Thread addX Name 1:Thread1
Thread addX Name in lock block:Thread1-->休息5秒
Thread Name delX 1:Thread2
Thread Name delX in lock block:Thread2-->此時進入了Thread2的block區塊,跟lock()有差異
Thread Name delX 2:Thread2
Thread addX Name 2 UNLock:Thread1
沒有留言:
張貼留言