1

私は現在、ちょっとした宿題で立ち往生していて、誰か助けてくれるかどうか疑問に思っていました -

Javaでセマフォを使用して、2つのスレッドからの文字の印刷を同期する必要があります.1つは「A」を印刷し、もう1つは「B」を印刷します。同じ文字を 2 つ以上続けて出力することはできないため、出力は次のようになります。

アーバババババババババアババババ

現時点では、3 つのセマフォ、1 に設定されたバイナリ ミューテックス、カウント セマフォがあり、スレッド クラスは次のようになります。

public void run() {
    while (true) {
        Time.delay(RandomGenerator.integer(0,20));
        Semaphores.mutex.down ();
        System.out.println (produce());

          if (printCount > 1)
          { printCount = 0;
                Semaphores.mutex.up ();
                Semaphores.printB.up();
          }
    } 
}
public String produce() {
    printCount++;
    return "A";
}


public void run() {
    while (true) {
        Time.delay(RandomGenerator.integer(0,20));
        Semaphores.mutex.down ();
        System.out.println (produce());

          if (printCount > 1)
          { printCount = 0;
                Semaphores.mutex.up ();
                Semaphores.printA.up();
          }
    } 
}
public String produce() {
    printCount++;
    return "B";
}

それでも、私が試してみても、デッドロックするか、せいぜい2行だけを印刷しているように見えますが、常に3行を時々印刷しているようです!

可能であれば、コードやほんの数個のポインターを探すのではなく、どんな助けも大歓迎です:)

4

1 に答える 1

2

printAおよびprintBセマフォを設定せずに設定しているように見えます。それらを複数回セットアップしようとすると、彼らは自分自身を待っているでしょう。


「どこに置いたらいいの?」というコメントに答える。

正直なところ、よくわかりません。私が想像できる唯一のことは、教授が(Javaで)最初に取得した回数よりも多くの回数セマフォを解放できるという事実を利用しようとしている場合です。

その場合、パターンは2つのセマフォになります。1つはプロデューサー「B」用で、もう1つはプロデューサー「B」用です。それぞれのプロデュースメソッドは、独自のセマフォで取得し、反対側のプロデューサーのセマフォでリリースします。したがって、セマフォの数は、プロデューサーが他のプロデューサーからの対応するリリースなしで取得した回数になりますが、この方法は、セマフォの概念的な意図とは相容れず、Java固有の実装に依存し、完全に私を不快にさせます。

スロットリングを実行する3番目のManagerまたはConsumerスレッドを使用するか、共有整数に対してインターロック操作を使用することで、これをより早く実装します。いずれにせよ、セマフォを使用しません。セマフォは、3人の短命のプロデューサーだけが自律的に実行されていることを確認したい場合に役立ちます

于 2012-11-18T16:47:42.773 に答える