0

私はLearningJava(Oracle Press Books)をやっていて、スレッドを学んでいます。例は本とは少し異なります。これまでのところ、それは理解できました。しかし、この最新のものは少し奇妙に思えます。コードは次のとおりです:http://pastebin.com/tu0qajMF

プログラムは、スレッド間のwait()およびnotify()との通信を示します。これには、2つの同期されたメソッドtickとtockを持つオブジェクトがあります。彼らは単にダニとトックを表示します。例を実行すると、「Tick TockTickTock...」になります。通常はこれを行います。それでも時々それは「TockTickTockTick」になります。

なぜこれをしているのですか?

コードを変更しないようにするにはどうすればよいですか?

4

2 に答える 2

3

スレッドが起動する前に事前同期を行っていないため、誰が最初に実行できるかという競争になります。最初の参加まで同期ポイントに到達しないため、その時点で 2 つのスレッドのいずれかが開始されている可能性があります。

于 2012-12-05T15:08:26.180 に答える
0

事前同期を追加することでこれを解決し、約15分間潜在意識に残してFacebookに投稿し、アイデアが思い浮かびました。思ったよりずっと簡単に解決できました。

クラス TickTock に「boolean virginity=true」というメンバを追加し、virginity が true の場合は Tock を待機させ、Tick は実行時に virginity を false に設定しました。そのため、MyThread が実行されると、Tick が常に最初に実行されます。これは、両方のスレッドが共有するオブジェクトに、Tock が Tick を待機し、競合がないことを保証する変数があるためです。

ここにコード: http://pastebin.com/AHCvcNa8

最初の質問への回答がなければ、これを解決することはできなかったでしょう。ありがとう、最初の質問回答者。

于 2012-12-05T18:32:29.627 に答える