0

我有两个线程。一个用于生成数据,第二个用于将它们发送到服务器。这是典型的生产者-消费者情况吗?为此,我构建了用于管理同步队列的简单代码 - 我希望:我做的或多或少是正确的?请问有人可以回答我吗?我的代码在下面:

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);

第二个循环发送数据:

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 回答