2

私は3つのクラスを持っています。ウェイター(スレッド)、テーブル(スレッド)、およびキュー(スレッドではない)(先入れ先出しキューに類似)。

最初に数人のウェイターが作成され、次にテーブルが作成されます。ウェイターよりもはるかに多くのテーブルがあるため、テーブルはウェイターがそれらを提供するのを「待つ」必要があります。この問題を解決するために、「Java同期プリミティブ、待機通知、および通知」を使用することになっています。各クラスのガイドラインは次のとおりです。

テーブル:開始されると、キューに入り、内部メソッドwaitService()を呼び出します。このメソッドは、サービスが提供されているか、ウェイターを待機しているかを返します。

私が今この方法を持っている方法:

$if(serviced)
        return 0;
    try {
        this.wait();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

ウェイター:ウェイターコードは実際には問題を引き起こしていませんが、基本的には、runメソッドに、待機中のテーブルがあるかどうかをチェックし、その後ランダムな時間そのテーブルサービスを提供する無限ループがあります。別のテーブルが待機しているかどうかをチェックします。テーブルクラス内でgiveService()メソッドを呼び出すことにより、テーブルにサービスを提供していることを通知します。

キュー:ウェイターのリストとテーブルのリストがあります。ウェイターは、サービスを提供する準備ができたら、キュークラスのnextTable()を呼び出します。これが私がそれを設定する方法です:

$public Table nextTable(Waiter w) throws InterruptedException {

    if(closed)
        return null;
    if(tables.isEmpty()) {
        w.wait();
    }
    Table t =  tables.removeFirst();
    t.notify();
    return t;   
}

上記にはいくつかの非常に根本的な間違いがあるかもしれませんが、基本的に、同期プリミティブがJavaでどのように機能するかはわかりません。どんな助けでもいただければ幸いです。

4

1 に答える 1

1

これは、wait()、notify()、notifyAll()の使用に関するチュートリアルと同じくらい優れています。最初にそれを読んで、SOがまだ回答していない追加の質問があるかどうか、または特に問題に何かがあるかどうかを確認してください。

http://www.java-samples.com/showtutorial.php?tutorialid=306

于 2012-04-04T14:10:16.067 に答える