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()このメソッドはブロックタイムアウトメソッドであり,スレッドが結果を返す前にブロックされ,タイムアウト時間を超えても返される.