列をふさぐ

6664 ワード

************************************************************************************************声明を出して********を**します。
      オリジナル作品は、「暁風残月xj」のブログから来ました。転載を歓迎します。転載する時は必ず出典を明記してください。http://blog.csdn.net/xiaofengcanyuexjを選択します
      様々な原因のため、多くの不足があるかもしれません。斧を歓迎します。
***************************************************************************************          
   スレッドの同期は、マルチスレッドが競合するリソースに安全にアクセスすることを保証する手段である。Javaにはスレッド同期の方法がたくさんあります。例えば、明示的なsynchronized、Lockなど、パイプラインやブロッキングキューなどの特殊なデータ構造がスレッド同期をサポートしています。この文章は私の行列渋滞に対する見方を話します。
 
一、行列をブロックする性質
      列を塞ぐ主な性質は以下の2つです。
1)いつでも一つのスレッドが要素を挿入または削除するだけです。
2)キューが空の場合、要素を取得または削除することはnullに戻りません。または異常を投げ出すのではなく、空でない場合まで待ちます。列が満タンの場合は、要素を挿入するのは異常ではなく、列がいっぱいにならないまで待ちます。
二、列のブロック例
       Javaライブラリが提供するブロッキング行列は主に以下の通りです。
1)、Linked Blocking Queの容量はデフォルトでは上限がない(指定されていない時はInteger.MAXUVALE)、最大容量を指定することもできます。チェーンに基づくキューです。この列はFIFOで要素を並べ替えます。2)ArayBlockingQueは、構造時に容量指定が必要であり、公平性が必要かどうかを選択できます。公平なパラメータがtrueに設定されていると、待ち時間が一番長いスレッドが優先的に処理されます。実はRentrant Lockをtrueに設定することによって、このような公平性を達成します。つまり、待ち時間が一番長いスレッドが先に操作されます。通常、公平性はあなたに性能の上で代価を払わせます。本当に必要な時だけ使います。これは配列に基づくブロッキングループ・キューであり、このキューはFIFO原則に従って要素を並べ替える。3)PriorityBlockingQueは優先順位のある列で、先進的な先に列を出るのではありません。要素は優先順位で削除されます。列にも上限がありません。(ソースコードを見てください。PriorityBlocking QueはPriorityQueの再包装です。データを積む構造に基づいています。PriorityQueは容量制限がないので、ArayListと同じです。優先的に列をふさぐ時にputは邪魔されませんが、列が空いていたら元素を取る操作はtakeでブロックされます。また、列に入る要素はないです。能力を比べる。4)、DelayQue(PriorityQueに基づいて実現された)は、Delayed要素を格納する無境界ブロック列であり、遅延期間満了時にのみ要素を抽出することができます。このキューの先頭は、遅延期間満了後の最長保存時間のDelayed要素です。遅延がまだ満期にならないと、キューは頭がなく、pollはnullに戻ります。要素のget Delay(TimeUnit.NANOSECONDS)この方法はゼロ以下の値を返します。期間が満了したら、この要素を削除します。このキューはnull要素を使用してはいけません。
三、ソースコード
/**
 * Created by xujinxj on 2015/1/22.
 */
    public enum State{
        DRY("dry"),
        BUTTERED("buttered"),
        JAMMED("jammed")
        ;

        private String description;
        State(String tDescription)
        {
            this.description=tDescription;
        }
        public String toSting() {
            return description;
        }
    };
/**
 * Created by xujinxj on 2015/1/22.
 */
public class Toast {
    private State state=State.DRY;
    private final int id;

    public Toast(int tId)
    {
        id=tId;
    }

    public void butter()
    {
        state=State.BUTTERED;
    }

    public void jam()
    {
        state=State.JAMMED;
    }

    public State getState()
    {
        return state;
    }

    public int getId()
    {
        return id;
    }

    public String toString()
    {
        return "Toast "+id+" : "+state;
    }

}
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * Created by xujinxj on 2015/1/22.
 */
public class Toaster implements Runnable {
    private ToastQueue toastQueue;
    private int count;
    private Random random=new Random(47);

    public Toaster(ToastQueue tToastQueue)
    {
        toastQueue=tToastQueue;
        count=0;
    }

    public void run()
    {
        try
        {
            while(!Thread.interrupted())
            {
                TimeUnit.MILLISECONDS.sleep(random.nextInt(50));
                Toast t=new Toast(count++);
                System.out.println(t);
                toastQueue.put(t);
                if(10==count)
                    return;
            }
        }
        catch(InterruptedException e)
        {
            e.printStackTrace(System.out);
        }
        finally
        {
            System.out.println("Toaster off");
        }
    }
}
/**
 * Created by xujinxj on 2015/1/22.
 */
public class Butterer implements Runnable {

    private ToastQueue dryToastQueue,buttererToastQueue;

    public Butterer(ToastQueue tDryToastQueue,ToastQueue tButtererToastQueue)
    {
        dryToastQueue=tDryToastQueue;
        buttererToastQueue=tButtererToastQueue;
    }


    public void run()
    {
        try{

            while(!Thread.interrupted())
            {
                Toast t=dryToastQueue.take();
                t.butter();
                System.out.println(t);

                buttererToastQueue.put(t);
            }
        }
        catch(InterruptedException e)
        {
            e.printStackTrace(System.out);
        }
        finally
        {
            System.out.println("Butterer off");
        }
    }
}
/**
 * Created by xujinxj on 2015/1/22.
 */
public class Jammer implements Runnable {

    private ToastQueue buttererToastQueue,jammerToastQueue;

    public Jammer(ToastQueue tButtererToastQueue,ToastQueue tJammerToastQueue)
    {
        buttererToastQueue=tButtererToastQueue;
        jammerToastQueue=tJammerToastQueue;
    }


    public void run()
    {
        try{

            while(!Thread.interrupted())
            {
                Toast t=buttererToastQueue.take();
                t.jam();
                System.out.println(t);
                jammerToastQueue.put(t);

            }
        }
        catch(InterruptedException e)
        {
            e.printStackTrace(System.out);
        }
        finally
        {
            System.out.println("Jammer off");
        }
    }
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * Created by xujinxj on 2015/1/22.
 */
public class ToastMatic {


    public static void main(String []args) throws InterruptedException {
        ToastQueue dryToastQueue = new ToastQueue(),
                buttererToastQueue = new ToastQueue(),
                jammerToastQueue = new ToastQueue();

        ExecutorService exec=Executors.newCachedThreadPool();

        exec.execute(new Toaster(dryToastQueue));
        exec.execute(new Butterer(dryToastQueue,buttererToastQueue));
        exec.execute(new Jammer(buttererToastQueue, jammerToastQueue));

        TimeUnit.SECONDS.sleep(10);
        exec.shutdown();
    }
}
      本例はスレッド池にも関連しており、いわゆるスレッド池(ThreadPool)アプリケーション内の同じ時刻に実行されるスレッド数を制限するのに有用です。新しいスレッドを起動するたびに、それぞれのパフォーマンスオーバーヘッドがあります。スレッドごとにメモリをスタックに割り当てる必要があります。同時に実行されるタスクをスレッドに転送して、各同時実行のタスクの代わりに新しいスレッドを起動します。プールに空きスレッドがある限り、スレッドがあります。タスクはスレッド実行に割り当てられます。オンラインプログラムの内部には、ブロック列が挿入され、スレッドプールのスレッドがこのキューのタスクを取りに行きます。新しいタスクがキューに挿入されると、空きスレッドがキューからジョブを取り出して実行します。
     BlockingQueの実現については、この記事を参照してください。Javaは列をブロックすることができる。 ,文章はよく書けています。ここでは多く話しません。
     時間が限られているので、ブログを書いている間に文献を参考にしました。ありがとうございます。