0

私は2つのスレッドを持っています。1つはデータを生成するためのもので、もう1つはデータをサーバーに送信するためのものです。これは古典的な生産者/消費者の状況ですか?これを行うために、同期キューを管理するための簡単なコードを作成しました-私は願っています:私はそれを多かれ少なかれ正しくしましたか?誰かが私に答えてもらえますか?私のコードは以下のとおりです。

public ArrayList<String> Packets;

public synchronized void add_to_Queue (String data) {
    Packets.add(data);
}

public synchronized void del_from_Queue (int position) {
    Packets.remove(position);
}

public synchronized String read_from_ Queue(int position) {
    return Packets.get(position);
}

public synchronized int number_of_element_of_Queue() {
    return Packets.size();
}

最初のスレッドは、簡単なコマンドを使用して新しいデータを配置することにより、新しいデータを追加します。

add_to_Queue("XYZ);

2番目はループでデータを送信します:

while (OK)
{
    try
    {
        while (number_of_element_of_Queue()>0)
        {
            out.write(read_from_Queue(0)+"\n");
            out.flush;
            del_from_Queue(0); // if no error delete just sent element
        }
    }
    catch (IOException e1)
    {
      reconnect();
    }
}

静的データ(「キュー」から読み取る代わりに単純な静的テキスト)を送信しても再接続(つまり、catch後(IOException e1))が発生しないため、何かが間違っていると思います。しかし、提示されたコードを使用すると、特に再接続後に非常に頻繁に発生します。それは数回行われます(いくつかのデータの送信、再接続、さらにいくつかのデータの送信、再接続など)。

4

1 に答える 1

1

ええ、キューが空の場合はどうなりますか?あなたはそれをチェックしたり処理したりしていないようです。しかし、それはあなたが説明していない唯一の条件ではありません。

より一般的には、示されている実装はキューの動作方法ではありません。キューは先入れ先出しであり、位置パラメータは必要ありません。「読み取り」、次に「削除」の概念はありません。これらの操作は通常、「取得」を介してアトミックです。独自の実装を作成するのではなく、既存のBlockingQueue実装を使用することをお勧めします。

于 2013-02-10T03:40:13.727 に答える