一部のモデルのマルチスレッドの問題

1.マルチスレッドの例は:

説明:列車のチケットシステム、そこに複数のウィンドウがありますが、唯一、同じシステムであっ投票します:

アイデアを設計します。一つだけのシステムがあります:

                       詳細デザイン:シングルデザインパターンの一般的なマルチウィンドウオブジェクトことを確実にします

                       同時スレッドの安全性を確保するためのベクトルコレクションフレームワークを使用します。

                  チケット複数のウィンドウ、複数のウィンドウをシミュレートする複数のスレッドを使用し、この方法は、組み合わせて使用​​するクラスのシステムの実行sellTicket()メソッドを呼び出します。

コードは以下の通りであります:

// チケットエンティティクラス

のパブリック クラスのチケット{
     // 開始ステーション、エンド価格
     // オブジェクトの唯一のいくつかの属性は、読みやすさ向上させる、多くのプロパティが含まれている
     // のJavaBean、POJOの
    文字列を起動し、
    文字列END; 
    フロート価格;   // キャップ、包装

    パブリックチケット(文字列開始、終了文字列、フロート価格。){
         この .start = スタート;
         この .END = END;
         この .price = 価格; 
    } 

    パブリックチケット(){ 
    } 

    パブリック文字列getStart(){
         戻りスタート; 
    }

    パブリック文字列getEnd(){
         戻り端と、
    } 

    公共フロートgetPrice(){
         戻り価格。
    } 

    公共 ボイドsetStart(文字列の開始){
         この .start = 始めます。
    } 

    公共 ボイドSETEND(文字列の末尾){
         この .END = END; 
    } 

    公共 ボイドsetPrice(フロート価格){
         この .price = 価格。
    } 

    // 重写のtoStringの方法、为了打印对象方便
    パブリック文字列のtoString(){ 
        StringBuilderのSB =新しい新しいのStringBuilder(); 
        sb.append(この .start。).append( " - >")追記(この .END).append( "価格").append(この.price);
         を返す 新しい新しい文字列(SB)を、
    } 
} 



// SystemTestクラス

パブリック クラスSystemTest { 

    // 唯一のシステム設計シングルトン
    プライベートSystemTest(){ 

    } 

    プライベート 静的 SystemTest ST = 新しい新しいSystemTest();
     // 静的:一意性を保証

    パブリック 静的に  (のgetInstance SystemTest){
         // 静的メソッド:あなたはクラス名で呼び出すことができます
        リターンST; 
    } 

    // 属性は、ArrayListに、ベクトルを設定- >同期、スタック
     プライベートベクトル<チケット> =チケット新規新しいベクトル<> (); 

    // 完全なブロックを使用して作成するために、現在のシステムは、チケットのセットを割り当てる、
    {
         INT 10 = I、I 100 <; I ++は){ 
            tickets.add(新しい新しいチケット( "北京" + I、 "深"は私は+、Iは+ 5%5 +。。25Fれる)); 
        } 
    } 

    // のセットから、方法を設計しますチケット取る
    公共チケットgetTicketが(){ 

        試み{
           返す   (0 tickets.removeを); 
        } キャッチ(例外Eを){
            リターン ヌル;
                // 無投票状況
        } 

    } 
} 


// ウィンドウのWindowsベースの

パブリック クラスウィンドウの拡張スレッド{ 
    文字列windowNameを、

    公共ウィンドウ(文字列windowName){
         この .windowName = windowName; 
    } 

    @Override 
    公共 ボイドRUN(){
         // 売ります投票
        sellTicket(); 
    } 
    公共 ボイドsellTicket(){
         ながら真の){ 
            SystemTest ST =SystemTest.getInstance();
             // 取得シングルトン

            チケットT = st.getTicket();
             //は、ベクトルコレクションからチケットを取得

            IF(T == nullの){ 
                System.out.printlnは(windowName +「窓チケットが販売されていますエンド" );
                 BREAK ; 
            } 
            のSystem.out.println(windowName +"販売「+ T); 
        } 
    } 
} 


// いるTestMain試験メインクラス

パブリック クラスにいるTestMain {
     公共 静的 ボイドメイン(文字列[]引数を){
         // ウィンドウの数は、全体のシステムのそれぞれは、そこにあります
        W1 =ウィンドウ新しい新しいウィンドウ( "北京駅" ); 
        ウィンドウW2 = 新しい新しいウィンドウ( "西安駅" ); 
        ウィンドウW3 = 新しい新しいウィンドウ( "重慶駅" ); 

        w1.start(); 
        w2.start(); 
        W3。開始(); 


    } 
}

 

 

2.印刷ABCABCABC ....... 10回になります:


各スレッド・オブジェクト・アクセス方法は、同時に得るための1つずつ実行することができないように、同期した方法を用いて被写体にロック。

具体:同期(オブジェクト){}

// あるクラスTestクラスは、印刷を実行することである

。// ロックオン

// スレッドクラスがアップ実行中のスレッドである
パブリック クラステスト実装のRunnable { 

    プライベート文字列名;    // EG:「」
    プライベートオブジェクトプリ;     // OA、 OB、前との間で循環OCと3つのオブジェクト後
    プライベートオブジェクト自己;    // 自分の

    パブリックテスト(文字列名、予めオブジェクト、オブジェクトの自己){
         この .nameの= 名;
         この .PRE = 予備;
         この .self = 自己; 
    } 


    / / 各スレッドは、各スレッドの方法を実行しています。
    @Override
    公共 ボイドRUN(){
         int型の数= 10;   //を印刷する10回をカウントダウン
        しながら(カウント> 0 ){
             同期(前){
                 同期(セルフ){ 
                    System.out.printの(名前を);    // ブロックのロック 
                    数- ; 

                    self.notify(); 
                } 
                試み{ 
                    pre.wait(); 
                } キャッチ(InterruptedExceptionあるE){ 
                    e.printStackTrace(); 
                } 
            } 

        } 
    }



//     @Override
 //     ます。public void RUN(){
 //         同期(前){
 //             同期(セルフ){   // ここにはあるのに対しロックループ
 //                 // ロックの問題を検討する独自のロジックを書きます
 //                 INT COUNT = 10;
 //                 一方(COUNT> 0){
 //                     するSystem.out.println(名+ COUNT);
 //                     count--;
 //                     self.notify();
 //                 }
 //             }
 / /             トライ{
 //                 pre.wait();
 //            }キャッチ(InterruptedExceptionある電子){
 //                 e.printStackTrace();
//             }
 //         }
 //     } 
} 


// 测试主类:


パブリック クラスメイン{ 


    公共 静的 ボイドメイン(文字列[]引数)スローInterruptedExceptionある{ 
        オブジェクトOA = 新しいオブジェクト(); 
        物体Ob = 新しいオブジェクト(); 
        オブジェクトOC = 新しいオブジェクト(); 

        新しいスレッド(新しいテスト( "A"、OC、OA))(開始)。
        Thread.sleep( 1000年); 

        新しいスレッド(新しいテスト( "B" 、OA、OB))(開始)。
        Thread.sleep( 1000年); 

        新しいスレッド(新しいテスト( "C" 、OB、OC))(開始)。
        Thread.sleep( 1000年); 
    } 

}

 

 

3.アナログ哲学者の食の問題:

 

 

 

 

 

P

 

おすすめ

転載: www.cnblogs.com/xbfchder/p/11504073.html