Javaのスレッドの知識の中で、チケット販売プログラムは非常に古典的です。プログラムにはいくつかの問題もあります!
要件:3つのWindowsで同時に販売中の100枚のチケットをシミュレートします。
質問1:なぜ300枚のチケットが販売されるのですか?
理由:チケットは非静的でないメンバー変数データは、各オブジェクトに1つのデータを維持し、3つのスレッドオブジェクトの3つの部分があります。
解決策:3つのスレッドオブジェクトのチケット番号を共有します。静的修正を使用します。
質問2:スレッドの安全性の問題はありますか?
スレッドの安全性の問題に対する解決策:Sunは、このタイプの問題を解決するためのスレッド同期メカニズムを提供します。
Javaスレッドの同期方法:
方法1:コードブロックを同期します
方法2:同期関数
クラスのsellticketsはスレッドを拡張します{static int quickets = 1; //投票数はここで静的として定義する必要があります。それ以外の場合、非静的なメンバー変数と非静的なメンバー変数データは、各オブジェクトにデータを維持します。 3つのスレッドオブジェクトの3つのコピーがあります。 public selltickets(string threadname){super(threadname); } public void run(){while(true){synchronized( "lock"){if(chickets == 101){// if(chickets> 100){system.out.println( "タイトルが売り切れ-_-...");壊す; } system.out.println(thread.currentthread()。getName()+"販売"+chutchets+"number quicke");チケット++; /* if(tickets == 101){//間違っています。チケット== 101の場合、1つのスレッドのみがジャンプします。チケット++は、他の2つのスレッドに存在します。壊す; } /* if(thread.currentthread()。getName()。equals( "window 2")){//ウィンドウ2は最大1枚のチケットでのみ販売でき、ブレークは終了します。 } */} //system.out.println(thread.currentthread()。getName()+"lock ..."); }}} public class demo4 {public static void main(string [] args){// 3つのスレッドオブジェクトを作成し、3つのWindows selltickets s1 = new selltickets( "window 1"); selltickets s2 = new selltickets( "ウィンドウ2"); selltickets s3 = new selltickets( "ウィンドウ3"); //スレッドチケットS1.Start()を開く; s2.start(); s3.Start(); System.out.println( "Main Method ..."); }}