【问题标题】:Java (Android) - Synchronized Queue and sending dataJava (Android) - 同步队列和发送数据
【发布时间】:2013-02-10 03:30:59
【问题描述】:

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

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) 之后)。但是当我使用提供的代码时,它经常发生,尤其是在重新连接之后。它会执行多次(发送一些数据、重新连接、发送更多数据、再次重新连接等等)。

【问题讨论】:

    标签: java android queue synchronized


    【解决方案1】:

    是的,如果队列为空怎么办?你似乎没有检查或处理它。但这不是您没有考虑的唯一条件。

    更一般地说,显示的实现不是队列的工作方式。队列是先进先出的,不需要位置参数。没有“读取”然后“删除”的概念,这些操作通常通过“获取”是原子的。最好使用现有的 BlockingQueue 实现而不是编写自己的实现。

    【讨论】:

    • 谢谢。我对BlockingQueue一无所知,不敢用。如果我这样使用它:声明:BlockingQueue Queue = new ArrayBlockingQueue(40) 和第一个线程 - 仅使用 Queue.put("XYZ") 放置数据,第二个使用 Queue.take( )?会安全吗?再次感谢您。
    • 按照您编写消费者的方式,您可能希望使用poll,然后检查null。但是,是的,您已经掌握了要做什么的要点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多