2011-10-20 91 views
2

我有一个线程,即接收tcp数据包并将每行添加到一个缓冲区,该缓冲区是ArrayList<String>。 另一个线程应该定期检查新数据是否可用,但只有当缓冲区当前未被锁定。但是,如何检查它是否被锁定?在C++中,我可以显式锁定一个互斥锁。Java:同步缓冲区

这是想我做一些伪代码:

while(buffer.isLocked()) 
{ 
    buffer.wait(); 
} 

buffer.lock(); 
buffer.add(tcpPacket); 
buffer.unlock(); 
buffer.notify(); 

这是迄今为止我java代码:

void process(String tcpPacket) 
{ 

    synchronized(buffer) 
    { 
     buffer.add(tcpPacket); 
    } 
    buffer.notify(); 
} 

回答

0

虽然在这种情况下,你可以考虑使用管道。 (PipedInputStream和PipedOutputStream),然后使用阻塞IO方法来确保线程在数据包到达时正确唤醒....这似乎是“共享缓冲区”问题的一种更为简单的方法。

+0

当管道充满时会阻塞生产者。这些管道流远比他们的价值更麻烦。 – EJP

+0

的确,尽管IO操作实际上是否可取的行为存在一个问题?那就是你不想超出你的消费者线程(如果消费者跟不上制作者,那么无界队列将消耗大量的内存)。在这种情况下,当管道填充时阻塞生产者线程中的IO是防止内存使用无限增长并确保消费者线程在缓冲区填满后获得优先级的好方法。 – user268396

+0

我个人只会有一个线程,让TCP实际上阻止发送者。我永远无法理解这两步设计的热情。阅读过程是消费者,写作过程是生产者。没有必要复制。 – EJP