私はそれを与えると、指定された瞬間を一時停止し、それを呼び出したスレッドの原因となるものは何でもメッセージこの方法プリントを呼び出す方法同期スレッド順次
public static synchronized void print(String message, int sleepTime) throws InterruptedException {
System.out.println(message);
Thread.sleep(sleepTime);
}
を持っています。別のスレッドが(もちろんprint
を呼び出す最初のスレッドを除く)寝て終了する前に、何のスレッドが印刷を開始しないことができるように、このクラスの複数のスレッドがそのprint
を同期させなければならないようstatic synchronized
はそれを作る
他に私のコードのどこかに、
print("some message", 1000);
print("some other message", 1000);
私はこのコードを使用して実行したすべての試験が最後の「他のいくつかのメッセージ」を印刷し、すべてのスレッドが続く最初の最初のメッセージ「いくつかのメッセージ」を、印刷するすべてのスレッドになった:私はこれをやって呼び出し元のスレッドを持っています。
some message
some message
some message
some other message
some other message
some other message
確かに、私はそれを実行していない:私は3つのスレッド、次のように予想される結果であるが(私は数回のコードを実行したとき、私はそれらを得ることができる)がある場合たとえば、
多くの試み。
しかし、最初のメッセージを印刷し終わったスレッド(このスレッドをAと呼ぶ)は、まだ最初のメッセージを印刷していない可能性があるスレッドと競合すると考えられます。 スケジューラが最初にBを選択する前にAを2回選択して、2番目のメッセージをどこかに印刷させる可能性はありますか?の前に、最初のメッセージのすべてのインスタンスが印刷されますか??言い換えれば
、これが起こる可能性がある:
some message
some message
some other message
some message
some other message
some other message
上記のシーケンスが可能な場合、どのように私はそれが起こらないことを保証することができますか?どのようにして最初のシーケンスが常にになることを保証できますか?
あなたが最初のシーケンスとはどういう意味ですか?最後の2つの質問はどちらも矛盾していますか? – developer
最初のシーケンスでは、すべての "some message"行をすべて印刷する前にすべての "some message"行を最初に印刷するものを意味します。第2のシーケンスは、メッセージを交換するものである。私はコードの各ブロックをシーケンスと呼んでいます。 – Manuel
大丈夫ですが、なぜそれをやりたいのですか?目的はあまり明確ではない。 – developer