HTML/JavaScript小工具

HTML/JavaScript小工具

2013年5月2日 星期四

Java 進階 Lock - 2 tryLock()

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

沒有留言:

張貼留言