11-コンカレントツールクラスSemaphore,callable
10493 ワード
一、Semaphore
トラフィック制御のための信号量であり、同時にN個のスレッドにアクセスすることを許可し、同時に3個のスレッドがプリンタを競争することを許可する.
public class PrintQueue {
private boolean freePrinters[];
private Lock lockPrinters;
//2. Semaphore, semaphore。
private final Semaphore semaphore;
// print quere semaphore 。
public PrintQueue(){
// 3
this.semaphore=new Semaphore(3);
freePrinters=new boolean[3];
for(int i=0;i<freePrinters.length;i++){
freePrinters[i]=true;
}
lockPrinters = new ReentrantLock();
}
public void printJob(Object document){
try{
semaphore.acquire();
//
int assignedPrinter=getPrinter();
long duration=(long)(Math.random()*10);
System.out.printf("%s: PrintQueue: Printing a Job during %d seconds
",Thread.currentThread().getName(),duration);
Thread.sleep(duration);
// ,
freePrinters[assignedPrinter]=true;
System.out.println("this assignedprinter is "+ assignedPrinter);
}catch (InterruptedException e){
}finally {
semaphore.release();
}
}
public int getPrinter(){
int ret = -1;
try{
lockPrinters.lock();
for(int i=0;i<freePrinters.length;i++){
if(freePrinters[i]){
ret = i;
freePrinters[i]=false;
break;
}
}
}catch (Exception e){
}finally {
lockPrinters.unlock();
}
return ret;
}
}
1、new Semaphore(3)
statusを同時にロックを取得できる個数に初期化する方法
2、semaphore.acquire()
スピンcasメソッドはstate-1を修正し、修理に成功するかstate<0が0未満の場合にブロックされるまでロックを取得します.
3、semaphore.release()
スピンcas方式state+1正常に修正された後にブロックされたスレッドを起動するまで
二、callable
スレッド実行結果を返し、feartrueTaskで実行結果を得ることができます.
callable,runnable,futrue,futrueTaskはcallableに連絡し、runnableはそれぞれインタフェースであり、戻り値があり、戻り値がないfutrueはインタフェースであり、runnable callableタスクに対する一連の操作を定義している:キャンセル、クエリーの完了、結果の取得、結果の設定操作
RunnableFutureインタフェース:runnable,futrue FutureTask実装クラスを継承し、RunnableFutureインタフェースを実装runnable,callableをパラメータとする構成方法を定義する(最終的にrunnableがcallableに変換されて実行される).だからFutureTask.get()はcallableの戻り値FutureTaskを得ることができる.get()このメソッドはブロックタイムアウトメソッドであり,スレッドが結果を返す前にブロックされ,タイムアウト時間を超えても返される.