4

I am doing a past exam paper of Java, I am confused about one question listed below:

What would happen when a thread executes the following statement in its run() method? (Choose all that apply.)

sleep(500);

A. It is going to stop execution, and start executing exactly 500 milliseconds later.

B. It is going to stop execution, and start executing again not earlier than 500 milliseconds later.

C. It is going to result in a compiler error because you cannot call the sleep(…) method inside the run() method.

D. It is going to result in a compiler error because the sleep(…) method does not take any argument.

I select A,B. but the key answer is only B, does there exist any circumstances that A could also happen? Could anyone please clarify that for me? Many thanks.

4

6 に答える 6

2

JVM は正確に 500 ミリ秒を保証することはできませんが、他のスレッドが少し遅延する可能性のあるリソースをブロックしていないことを考慮して、「エンジン」を再起動する必要があるため、約 500 ミリ秒以降に起動します。

読む: Hotspot VM の内部: クロック、タイマー、スケジュール イベント

編集:グレイがコメントで指摘したように-他のスレッドとのスケジューリングも要因であり、あるスレッドから別のスレッドへのスワップには時間がかかる場合があります。

于 2013-10-21T18:05:13.247 に答える
1

Javadocによると:-

寝る()

現在実行中のスレッドを、指定されたミリ秒数だけスリープ (一時的に実行を停止) させます。これは、システム タイマーとスケジューラの精度と精度に依存します。スレッドは、どのモニターの所有権も失いません。

したがって、〜500ミリ秒になる可能性があります

B. 実行を停止し、500 ミリ秒以内に再び実行を開始する。

より際立って見えます。

于 2013-10-21T18:06:42.657 に答える
0

これらのスリープ時間は、基盤となる OS によって提供される機能によって制限されるため、正確であるとは限りません。Option B: Not earlier than 500の方が正しいです。

于 2013-10-21T18:07:21.490 に答える
0

A と B は互いに反対であるため、選択できません。主な違いは次のとおりですexactly 500 milliseconds laternot earlier than 500 milliseconds later

最初はそれが何を意味するかを正確に意味します(500ミリ秒のみ)、2番目は501または502または50000000000000をスリープできることを意味します

次の質問 - なぜ B が真なのか、単純な質問ではありません。ハード リアルタイムとソフト リアルタイムの違いを理解する必要があります。すべての理由を説明するのはトピックから外れているので、簡単に答えてください。多くの技術的な理由があるためです。 Java はコードのハード リアルタイム実行を保証できません。これが、スリープが終了すると述べた理由です。not earlier than ...

スレッドのスケジューリング、優先度、ガベージ コレクション、プリエンプティブ マルチタスキングについて読むことができます。これらはすべてこれに関連しています。

于 2013-10-21T18:10:13.630 に答える