0

get メソッドが機能しない理由がわかりません。" " を返します。

このクラスを使用する Producer クラスと Consumer クラス、および set メソッドと get メソッドだけを持つ Buffer インターフェイスがあります。プロデューサーはファイルから読み取り、コンシューマーは別のファイルに書き込みます。Producer と Consumer の両方がスレッドを使用します。

私を助けてください。前もって感謝します。

import java.util.Stack;

public class synchronizedFile implements Buffer {

public Stack<String> StackBuffer = new Stack<String>();

public void set(String value) {

    synchronized (StackBuffer) {
        if (StackBuffer.size() <= 15) {
            StackBuffer.push(value);
            System.out.println(StackBuffer.toString());
            StackBuffer.notifyAll();
            System.out.println("Consumer notify");
        } else {
            try {

                System.out.println("Produser is waitting--------------------------------");
                StackBuffer.wait();
                System.out.println("Consumer tries to write");
                set(value);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

public String get() throws InterruptedException {

    String Flag = " ";
    synchronized (StackBuffer) {
        if (!StackBuffer.isEmpty()) {

            Flag = StackBuffer.firstElement();
            StackBuffer.remove(StackBuffer.firstElement());
            StackBuffer.notifyAll();
            System.out.println("Producer notify");
            return Flag;
        } else {
            StackBuffer.wait();
            System.out.println("Consumer is waitting --------------------");
            get();

        }

    }

    return Flag;

}

}
4

3 に答える 3

1

待って、満杯と空の2つの異なるステータスを通知します。したがって、2つの別々のロックオブジェクトを使用する必要があります。これについては、少し前にここで説明しました。

Stack基本的に、クラスまたはある種の割り当てを使用するためにこれを実装していない場合は、java.util.concurrentのBlockingQueueを使用してください。

于 2013-02-15T13:54:45.460 に答える
1

get()メソッドのブランチに少なくともaFlag = get()がありません。else

BlockingQueueの使用を検討する以外にjava.util.concurrent、並行プログラミングで手間のかかる作業を行う実装があります。低レベルの構成を使用するwaitと、notifyエラーが発生しやすくなります。徹底的にチェックしなくても、実装が正しければびっくりします。

于 2013-02-15T13:50:50.850 に答える
0

get()ここでは、再帰的に呼び出しますが、その結果を破棄します。

StackBuffer.wait();
System.out.println("Consumer is waitting --------------------");
get();

のようなもの、Flag = get();またはreturn get();より適切なもの。

(また、synchronizedセクションを2回入力することwaitが有効かどうかはわかりません。おそらく、有効かどうかはわかりません)。

于 2013-02-15T13:50:33.350 に答える