0

従来のコンシューマー/プロデューサー スレッドのシナリオでは、キューにベクトルを使用する必要があります。ベクターに要素が存在するまで、一方のスレッドが他方のスレッドを待機する必要があるため、次の方法を試しました。

public synchronized  QueueLine getCustomer(int index)
    {
        while (Customers.isEmpty())
        {
            try 
            {
                wait();
            } 
            catch (InterruptedException e) {}
        }
        return Customers.elementAt(index);
    }

一方、他のスレッドは「顧客」ベクトルに追加し、通知を使用します。一度通知()が他のスレッドに影響を与えないので、私は何か身に着けていることを知っています。

4

2 に答える 2

1

コンシューマ インスタンスで同期しています。で同期する必要があると思いますVector

public QueueLine getCustomer(int index) {
    synchronized (Customers) {        
        while (Customers.isEmpty()) {
            Customers.wait();
        } 
        return Customers.elementAt(index);
    }
}

プロデューサーでは、同じことを行う必要があります: で同期して通知しますVector

于 2011-06-11T22:20:09.527 に答える
1

これは実際に機能するはずであり、これを実装するための通常の方法の 1 つです (つまり、何かが機能しない場合は、ここには表示されていないコードの残りの半分にバグがある可能性があります)。しかし、実際には、このようなものを自分で実装する理由はありません (宿題を除いて ;))。この問題に対していくつかの可能な解決策を持つ完全に優れた Java 並行パッケージがあるためです。

必要なものの 1:1 実装は、BlockingQueueになります(その実装の 1 つ - モデルに最適なものを選択してください)。

Java 1.2以降に廃止されたクラスを本当に使用する必要がある場合は、正確に何が間違っているのかを理解できるように、コードをもっと投稿する必要があります。

于 2011-06-11T22:13:27.157 に答える