0

スレッドを使用してリーダーライターの問題の解決策を開発しました。

私は 1 つのモニター クラスと 1 つのリーダーと 1 つのライター クラスを持っています。リーダーとライター クラスはスレッドを拡張します。

今、私は次のようなコードをテストしています:

public static void main(String[] args) {

  ReadersWriters controller = new ReadersWriters();
  Reader r0=new Reader(controller);
  Reader r1=new Reader(controller);
  Reader r2=new Reader(controller);
  Reader r3=new Reader(controller);
  Writer w0=new Writer(controller);
  Writer w1=new Writer(controller);
  Writer w2=new Writer(controller);
  Writer w3=new Writer(controller);
  r0.run();
  w0.run();
  r2.run();
  r3.run();
  r1.run();
  r3.run();
  r2.run();
  w2.run();
  r1.run();
  w1.run();
  w3.run();
 }

そして、私が得ている出力はこれです:

Reader number 0 arrives
Reader number 0 starts to read
Reader number 0 finishes reading
Writer number 0 arrives
Writer number 0 starts to write
Writer number 0 finishes writing
Reader number 2 arrives
Reader number 2 starts to read
Reader number 2 finishes reading

...等々。ここでの問題は、同時実行性をテストできないことです。メイン プログラムがリーダーまたはライターを 1 つずつ呼び出しているように見えるため、これは私が達成しようとしている種類のテストではありません。

誰でも私を助けてくれませんか。必要な説明があればお気軽にお尋ねください。

4

3 に答える 3

4

を実装したようですがRunnable、スレッドにラップしていません。スレッドではなく で呼び出しrun()ていると思われます。スレッドの定義/開始に関するチュートリアルのセクションを確認してください。Runnablestart()

単体テストなどでマルチスレッド コードを確実にテストすることはできません。1 回または何度も動作し、100 万回のテスト ケースで 1 回だけ失敗する可能性があります (またはすぐに運用環境で)。スレッドセーフなコーディング手法 (不変オブジェクトの作成など)、静的コード分析ツール (PMD など)、そして確信が持てない場合はコード レビューをお勧めします。

于 2012-11-11T21:10:33.977 に答える
1

start メソッドを使用してスレッド run メソッドを呼び出す (呼び出す) 必要があります。public void run()を使用して呼び出す必要がありますthread.start()

r0.run();

する必要があります

r0.start();
于 2012-11-11T21:10:35.013 に答える
1

拡張Threadして呼び出す代わりに、インターフェイスをThread.run()実装し、 a を使用してスレッドを実行/制御する必要があります。RunnableThreadPoolExecutor

于 2012-11-11T21:11:38.240 に答える