同期ロックチケット販売窓口ケースのJavaマルチスレッド実装

同期の概念と方法:

 ウィンドウクラス:

public class Ticket implements Runnable{
    int tickets=20;//总共20张票
    @Override
    public  void run() {
        while (tickets>0) {
            synchronized (this) {
                if(tickets>0) {
                    //售票
                    try {
                        System.out.println(Thread.currentThread().getName()+"正在售票");
                        Thread.sleep(200);//模拟售票操作时间
                        tickets--;//完成售票
                        System.out.println(Thread.currentThread().getName()+"售票完成,"+"剩余"+tickets+"张票");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

テストクラス:

public class Test {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();

        //模拟三个窗口售票
        Thread t1=new Thread(ticket);
        t1.setName("窗口1");
        t1.start();

        Thread t2=new Thread(ticket);
        t2.setName("窗口2");
        t2.start();

        Thread t3=new Thread(ticket);
        t3.setName("窗口3");
        t3.start();
    }
}

試験結果:

ウィンドウ 1 がチケットを販売中
ウィンドウ 1 のチケット販売が完了しました。残り 19 枚です。
ウィンドウ 1 がチケットを販売しています
ウィンドウ 1 のチケット販売が完了しました、残り 18 枚のチケット
ウィンドウ 1 でチケットが販売されています
ウィンドウ 1 のチケットの販売が完了しました、残り 17 枚のチケット
窓口 3 窓口 3 でチケットを販売中
窓口 3 でのチケット販売が完了し、残り 16 枚です。
窓口 2 でチケットを販売中 a> チケットはウィンドウ 2 で販売されています。 窓口 2 でのチケット販売終了しました。チケットは 14 枚残っています。 窓口 2 でチケット販売中
窓口 2 でのチケット販売が完了し、残り 15 枚 チケットウィンドウ 2 でチケットを販売しています ウィンドウ 2 のチケット販売が完了しました。残り 12 枚です。 ウィンドウ 2 でチケットを販売しています。 ウィンドウ 2 で販売中ですチケット、残り 11 枚のチケットがあります ウィンドウ 2 でチケットが販売されています ウィンドウ 2 でチケットが販売されています 完了しました、残り 10 枚のチケットがありますウィンドウ 2 でチケットを販売しています ウィンドウ 2 のチケット販売が完了しました、残り 9 枚です ウィンドウ 2 でチケットを販売しています ウィンドウ 2 のチケット販売完了しました、残り 8 枚のチケット ウィンドウ 2 がチケットを販売しています ウィンドウ 2 のチケット販売が完了しました、残り 7 枚のチケット a> ウィンドウ 2 のチケット販売は完了しました。チケットは 0 枚残っています チケットはウィンドウ 2 で販売中 チケットは現在販売されていますウィンドウ 2 で販売中 チケットは 2 窓口で販売が完了し、残り 1 枚です。 チケットは 2 窓口で販売中です 窓口 2 はチケットを販売しています。チケットは 2 枚残っています 窓口 2 はチケットを販売しています。 窓口 2 はチケットを販売しています。チケットは 3 枚残っています。 ウィンドウ 2 でチケット販売中 ウィンドウ 2 チケット販売完了、チケット残り 4 枚 ウィンドウ 2 でチケット販売中 ウィンドウ 2 のチケット販売は完了しました、チケット残り 5 枚 ウィンドウ 2 はチケットを販売しています。 ウィンドウ 2 はチケットを販売しています。チケットは 6 枚残っています。 ウィンドウ 2 が販売中ですチケット





























プロセスは終了コード 0 で終了しました

同期ロックなしのテスト結果:

ウィンドウ 3 がチケットを販売しています
ウィンドウ 1 がチケットを販売しています
ウィンドウ 2 がチケットを販売しています
ウィンドウ 1 はチケット販売中、残り 18 枚
チケットは窓口 1 で販売中です。
窓口 2 でのチケット販売は終了しました。チケットは 19 枚残っています。
窓口 3 でのチケット販売が完了し、残り 19 枚 チケット
窓口 2 でチケットが販売されています
窓口 3 でチケットが販売されています< /span> 窓口 3 のチケット販売は終了しました。チケットは 16 枚残っています。 チケット販売は次のとおりです。窓口 1 は終了しました。チケットは 15 枚残っています。 窓口 2 でのチケット販売中です。
窓口 2 でのチケット販売は終了しました。残り 16 枚です。 ウィンドウ 3 はチケットを販売しています。 ウィンドウ 3 はチケットを販売しています。チケットは 13 枚残っています。 ウィンドウ 1 のチケットは販売が完了しました。チケットは 14 枚残っています。 ウィンドウ 3 のチケットの販売が完了しました、2 枚のチケットが残っています ウィンドウ 1 のチケット販売が完了しました。残り 1 枚のチケット ウィンドウ 2 のチケット販売は完了しました、残り 0 枚のチケット ウィンドウ 3 はチケットを販売しています。残り 1 枚のチケットです。 ウィンドウ 3 はチケットを販売しています ウィンドウ2 はチケットを販売しています ウィンドウ 1 はチケットを販売しています 窓口1 枚のチケットの販売が完了しました、3 枚のチケットが残っています 窓口 2 のチケットは販売完了、残り 2 枚 窓口 3 でチケット販売中 チケット窓口 2 で販売中 チケットは窓口 1 で販売中です。 窓口 3 でのチケット販売は完了しました。チケットは 7 枚残っています。 窓口 1 でのチケット販売は完了しました。チケットは 5 枚残っています。チケットは残っています 窓口 2 でのチケット販売が完了しました。チケットは 5 枚残っています。 窓口 3 でチケットが販売されています ウィンドウ 2 でチケットを販売中 ウィンドウ 1 でチケットを販売中です。 ウィンドウ 3 のチケット販売が完了しました。残り 8 枚のチケットがあります。 窓口 1 でのチケット販売は完了しました。チケットは 8 枚残っています。 窓口 2 でのチケット販売が完了しました。チケットは 8 枚残っています。窓口 3 でのチケット販売が進行中です。 窓口 2 がチケットを販売しています 窓口 3 がチケットを販売中、残り 11 枚のチケットがあります 窓口 1 がチケットを販売中 ウィンドウ 1 のチケットは販売完了しました。残り 11 枚のチケットです。 ウィンドウ 2 のチケットは販売完了しました。残り 10 枚のチケットです。 ウィンドウ 3 はチケットを販売中です。 ウィンドウ 2 が販売中です チケットの販売 ウィンドウ 2 のチケット販売が完了しました。残り 12 枚のチケットがあります。 ウィンドウ 1 がチケットを販売中





































プロセスは終了コード 0 で終了しました

同期とロックロックの違い:

Java の同期と Lock_インターネット カフェのブログに行くのを手伝ってください - CSDN blog_java のロックの同期とロック

おすすめ

転載: blog.csdn.net/qq_52135683/article/details/126820293