Javaのスレッドを使用--Semaphore

オリジナル:転載は元のアドレスを示すhttps://www.cnblogs.com/fanerwei222/p/11872132.html

Javaのスレッドを使用--Semaphore

セマフォセマフォ、また場合、それだけで、セマフォを持ってまで、唯一のラインがライセンスを得たことなどチケット窓、窓の作業、Dafanウィンドウに似ライセンスマネージャを、と呼ばれます。

パッケージconcurrent.semaphore。

輸入java.util.concurrent.Semaphore;

/ **
 *セマフォ、ライセンスマネージャのメインテストクラス
 * / 
パブリック・ クラスMainTest {

    パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{
         / **を
         * 2つのチケットのウィンドウを定義し、公正なキューイングのチケット
         * / 
        セマフォticketWindow = 新しいセマフォ(2、真の);
        []のスレッドスレッド = 新しいスレッド[10 ]。
        以下のためにINT I 0 =; I <30; I ++ ){
             / **
             *固守は10の小さなパートナーの前に整列します
             * / 
            IF(I <10 ){
                 新しい新しいスレッド(新しい新マン( "訓練無実" + I、ticketWindow、0 ))スタート();
            } そう なら(I> = 10 && I <20 ){
                 / **
                 *この5人の小さなパートナーは、忍耐を持って、そしてそのわずか1ミリ秒はありません
                 * / 
                新しい新しいスレッドを(新しい新マン( "罪のない平面" + I、ticketWindow ,. 1 ))スタート();
            } {
                 / **
                 *この5人の小さなパートナーは、忍耐を持っていません
                 * / 
                スレッド[I - = 20である] 新しい新しいスレッド(新しい新 + I、ticketWindow、2マン( "夕食のために無実の家" ));
                スレッド[I - 20 ] .start();
            }
        }

        Thread.sleep( 2000 );
        以下のためにINT iは= 0; I <5; I ++ ){
            スレッド[I] .INTERRUPT()。
        }
    }

    のショー(){
         / **
         *初期ライセンス数、ライセンス5 /セマフォ、公正モード
         * / 
        セマフォセマフォ = 新しいセマフォ(5、真の);
        してみてください{
             / **
             *ライセンス/セマフォを取得します。
             *このスレッドブロックライセンスを取得、または中断されるまで(例外:InterruptedException例外がスローされます)
             * /
            semaphore.acquire();
        } キャッチ(InterruptedExceptionある電子){
            e.printStackTrace();
        }
        / **
         *ライセンス/セマフォをリリース
         * /
        semaphore.release();
        してみてください{
             / **
             * 3つのライセンス/セマフォを取得します。
             *このスレッドブロックライセンスを取得、または中断されるまで(例外:InterruptedException例外がスローされます)
             * / 
            semaphore.acquire( 3 )。
        } キャッチ(InterruptedExceptionある電子){
            e.printStackTrace();
        }
        / **
         *リリース3つのライセンス/セマフォ
         * / 
        semaphore.release( 3 )。
        / **
         *スレッドがライセンスを待ってあります
         * /
        semaphore.hasQueuedThreads();
        / **
         *キューの長さがライセンスを待っている(スレッド数)
         * /
        semaphore.getQueueLength();
        / **
         *残りライセンス数
         * /
        semaphore.drainPermits();
        / **
         *以下falseを返す取得、取得してください
         * /
        semaphore.tryAcquire();
        / **
         それが取り出されたとき*中断することはできません。
         * /
        semaphore.acquireUninterruptibly();
    }
}
パッケージconcurrent.semaphore。

輸入java.util.concurrent.Semaphore;
輸入java.util.concurrent.TimeUnit。

/ **
 人々のチケット*キューイング
 * / 
パブリック クラスマン実装Runnableを{

    / **
     人の*チケットの名前
     * / 
    プライベート文字列名;
    / **
     *チケットは証明されなければなりません
     * / 
    プライベートセマフォセマフォ。
    / **
     *最後の行為
     * 0:これまでのチケットを取得するには
     * 1:せっかちなラインアップ、行くには、飛行機のチケットを買いに行きます
     * 2:突然何かが家に帰ったときにラインアップ
     * / 
    プライベート int型のbehav。

    パブリックマン(文字列名、セマフォセマフォ、INT behav){
         この .nameの= 名前。
        この .semaphore = セマフォ。
        この .behav = behav。
    }


    @オーバーライド
    公共 のボイドの実行(){
         スイッチ(behav){
             / **
             最後にまで*固守
             * / 
            ケース 0 / **
                 *キューイング、忍耐力は、ライセンスを取得することです
                 * /
                semaphore.acquireUninterruptibly();
                してみてください{
                    Thread.sleep( 1000年);
                    System.out.println(「私はチケットにそれをよ!!」+ 名前)。
                } キャッチ(InterruptedExceptionある電子){
                    e.printStackTrace();
                }
                semaphore.release();
                System.out.println( "うわー、私は最終的にそれを投票してもらう!!" + 名);
                 BREAK ;
             / **
             *私は飛行機を購入することはできません
             * / 
            ケース 1 トライ{
                     場合(semaphore.tryAcquire(1 、TimeUnit.SECONDS)){
                        System.out.println(「私はチケットにそれをよ!!」+ 名前)。
                        Thread.sleep( 2000 );
                        semaphore.release();
                        System.out.println(「うわー、私は最終的にそれを投票してもらう!!」+ 名前)。
                    } {
                        System.out.println(「私は取る、とAmbyを飛んでいない!!」+ 名前)。
                    }
                    休憩;
                } キャッチ(InterruptedExceptionある電子){
                    e.printStackTrace();
                }
                / **
             *私は家を購入することはできません
             * / 
            ケース 2 試し{
                    semaphore.acquire();
                    してみてください{
                        Thread.sleep( 1000年);
                        System.out.println(「私はチケットにそれをよ!!」+ 名前)。
                    } キャッチ(InterruptedExceptionある電子){
                        e.printStackTrace();
                    }
                    semaphore.release();
                    System.out.println(「うわー、私は最終的にそれを投票してもらう!!」+ 名前)。
                } キャッチ(InterruptedExceptionあるE){
                     // e.printStackTrace(); 
                    System.out.printlnは( "まあは、夕食のために家に行く" + 名前)。
                }
                休憩;
            / **
             *牛は、この人がやっていることを知りません
             * / 
            デフォルト休憩;
        }
    }
}

次のように印刷は次のとおりです。

私はチケットの友人!!よ  列車の良い市民0
私はそれがチケットだ !!   善良な市民を育成1
うわー、私は最終的にそれを投票してもらう !!   善良な市民を養成0
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成1
私が取る、とAmby飛んでいない !!   無実10を平面
私が取る、とAmby飛んでいない !!   無実17を平面
私が取る、とAmby飛んでいない !!   無実19を平面
私が取る、とAmby飛んでいない !!   無実16を平面
私が取る、とAmby飛んでいない !!   無実13を平面
私が取る、とAmby飛んでいない !!   無実15を平面
私が取る、とAmby飛んでいない !!   無実14を平面
私が取る、とAmby飛んでいない !!   無実12を平面
私が取る、とAmby飛んでいない !!   無実11を平面
私が取る、とAmby飛んでいない !!   無実18を平面
私はそれがチケットだ !!   善良な市民を育成3
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成3
私はそれがチケットだ !!   善良な市民を育成2
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成2
まあ、無実の夕食の20のために家に行くために夕食のために家に帰ります
まあ、無実の夕食の23のために家に行くために夕食のために家に帰ります
まあ、無実の夕食の22のために家に行くために夕食のために家に帰ります
まあ、無実の夕食の24のために家に行くために夕食のために家に帰ります
まあ、無実の夕食の21のために家に行くために夕食のために家に帰ります
私はそれがチケットだ !!   善良な市民を育成4
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成4
私はそれがチケットだ !!   善良な市民を育成5
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成5
私はそれがチケットだ !!   善良な市民を養成6
うわー、私は最終的にそれを投票してもらう !!   善良な市民を養成6
私はそれがチケットだ !!   善良な市民を育成7
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成7
私はそれがチケットだ !!   善良な市民を養成8
うわー、私は最終的にそれを投票してもらう !!   善良な市民を養成8
私はそれがチケットだ !!   善良な市民を育成9
うわー、私は最終的にそれを投票してもらう !!   善良な市民を育成9
私は切符それだ !!   無実の夕食の25のために家を
うわー、私は最終的にそれを投票してもらう !!   夕食無実の25のための家を
私は切符それだ !!   無実の夕食の26のために家を
うわー、私は最終的にそれを投票してもらう !!   夕食無実の26のための家を
私は切符それだ !!   無実の夕食の29のために家を
うわー、私は最終的にそれを投票してもらう !!   夕食無実の29のための家を
私は切符それだ !!   無実の夕食の27のために家を
うわー、私は最終的にそれを投票してもらう !!   夕食無実の27のための家を
私は切符それだ !!   無実の夕食の28のために家を
うわー、私は最終的にそれを投票してもらう夕食無実の28のために!家を

 

おすすめ

転載: www.cnblogs.com/fanerwei222/p/11872132.html