我是Java的新手,我想实现一个线程可以写入的byte[]
缓冲区,另一个线程可以读取。
听起来应该已经在java
中实现了,但是我花了好几个小时试图找到/理解了几个类,我不明白它是否符合我的要求,以及如何使用它。登记/>
我看到BufferedInputStream
,ByteBuffer
,ByteChannel
,BlockingQueue
......
有人可以指出一个更具体的方向吗?
我使用SDK 1.6
答案 0 :(得分:5)
如果您希望简单地将字节从一个线程流式传输到另一个线程,我建议您使用PipedInputStream
和PipedOutputStream
。虽然请注意,由于设计错误,您可能需要这样的解决方案。
以下是您将如何做这样的事情,例如:
PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);
new YourReadingThread(in).start();
new YourWritingThread(out).start();
然后,您写给out
的任何内容都可以通过in
阅读。
如果您正在寻找一个解决方案来使线程安全ByteBuffer,我建议您使用ReentrantReadWriteLock
:
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
ByteBuffer buffer = ByteBuffer.allocate(n);
// Reading thread:
lock.readLock().lock();
buffer.get(i);
lock.readLock().unlock();
// Writing thread:
lock.writeLock().lock();
buffer.put(b,i);
lock.writeLock().unlock();
答案 1 :(得分:2)
抱歉,ByteBuffer
对我不利,因为它涉及到缓冲区的position
。
我意识到我真正需要的只是一个简单的pipe
(我不知道怎么会忘记管道)。
我使用了来自here的示例:
PipedOutputStream output = new PipedOutputStream();
PipedInputStream input = new PipedInputStream(output);