4

短いバージョン: Java で、スレッドが待機状態になっている時間を調べる方法はありますか? 関連する場合、参照しているオブジェクトは への呼び出しによって待機状態に送られcondition.await()ます。

長いバージョン: (これは宿題です)

私は、同期された共通の「会議室」を使用して、10 個のサプライヤー スレッドと 10 個のコンシューマー スレッドを作成するプログラムに取り組んでいます。サプライヤー スレッドは少しの間スリープし、乱数を生成し、(会議室のデータ フィールドが空の場合) そのフィールドに乱数を入力し、同じ ID を持つコンシューマー スレッド用にマークします。データ フィールドが空でない場合、それらawaitは占有状態にあります。コンシューマー スレッドは、会議室のデータがマークされているかどうかを確認します。マークされていない場合は、await間違った ID 状態にあります。その場合は、数値をデータ フィールドに保存し、null に設定しOccupied.signalAll()て、データ フィールドが空になったことをサプライヤ スレッドに通知するために呼び出します。(サプライヤ スレッドwrongID.signalAll()は、新しいデータがフィールドにあることをコンシューマ スレッドに通知するために呼び出します)。

いくつかの診断printlnステートメント (サプライヤー 0 が会議室に入り、データを残す / サプライヤー 1 が待合室に入る...) があり、すべてが正常に機能しているようです。また、スレッドがウェイクアップしたときに、スレッドが待機状態にあった時間を表示するステートメントを出力したいと思います。これは可能ですか?

また、誰かがここで私のロジックに欠陥を見つけた場合は、遠慮なく指摘してください (これはマルチスレッドへの私の最初の進出の 1 つです)。

4

1 に答える 1

1

wait()(それはfinal)またはCondition(独自の実装を作成しない限り..)オーバーライドできないため、可能な限り単純なことをおLock勧めConditionします。

スレッド (コンシューマーとサプライヤーの両方) に次のようなコードがあるとします。

while (conditionForWaiting) {
    condition.await()
}

System.currentTimeMillis()これにより、while ループに入る前にタイムスタンプを追加できます ( conditionForWaitingtrue の場合)。次に、(System.currentTimeMillis()-startTime)/1000スレッドが待機に費やした秒数を出力するだけです。または、それをフィールドに保存し、ゲッターを使用してください。

于 2013-04-06T23:11:20.113 に答える