Java NIO管道和ByteBuffer

Java NIO管道和ByteBuffer,java,bytebuffer,Java,Bytebuffer,我正在尝试将一个线程(IO1)中的一些ByteBuffer导入另一个线程(IO2) -- skChannel.write(byteBuffer1)和 Log.v(“==========IO1”,String.valueOf(read)) 几乎每秒触发20次,这是预期的行为,到目前为止还不错 IO2 = new Thread(new Runnable() { public void run() { try { int re

我正在尝试将一个线程(
IO1
)中的一些
ByteBuffer
导入另一个线程(
IO2

--

skChannel.write(byteBuffer1)
Log.v(“==========IO1”,String.valueOf(read))
几乎每秒触发20次,这是预期的行为,到目前为止还不错

IO2 = new Thread(new Runnable()
{
    public void run()
    { 
        try
        {
            int read;
            while (  (read =sourceChannel.read(byteBuffer2)) >0)
            {
                Log.v("========IO2 ", String.valueOf(read));
                //this triggered only once

                // To do Codec etc.
                //............
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        } 
        Log.v("========IO2 ", "END!!!!!"); //never triggered(this is fine)
    }
});
但是,
Log.v(“=============IO2”,String.valueOf(read))只触发一次,我不知道为什么

有人能告诉我如何在
IO2
中获得线程
IO1
的更新吗

谢谢。

您需要在写入前翻转()缓冲区,然后压缩()

但是:一句话,不要。线程之间的管道基本上是没有意义的。使用队列,或者让接收线程直接读取发送线程的输入

如果必须这样做,基本NIO复制循环如下所示:

while (in.read(buffer) > 0 || buffer.position() > 0) // or whatever your read API needs
{
    buffer.flip();
    out.write(buffer);
    buffer.compact();
}

谢谢EJP,我准备另一个线程的原因是我需要MediaCodec循环。正如您在这里看到的,它需要一个特定的(while)循环。事实上,我很困惑如何将其与AudioRecord循环线程一起实现。您是否仍然认为线程之间的管道在此场景中毫无意义?再一次,我对此感到困惑,所以,谢谢。我按照你的建议放弃使用双线程的方法,并且越来越接近我所需要的。我为此提出了一个新问题:如果你对这个问题感兴趣,请加入。这是一个+400声誉悬赏问题。
IO2 = new Thread(new Runnable()
{
    public void run()
    { 
        try
        {
            int read;
            while (  (read =sourceChannel.read(byteBuffer2)) >0)
            {
                Log.v("========IO2 ", String.valueOf(read));
                //this triggered only once

                // To do Codec etc.
                //............
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        } 
        Log.v("========IO2 ", "END!!!!!"); //never triggered(this is fine)
    }
});
while (in.read(buffer) > 0 || buffer.position() > 0) // or whatever your read API needs
{
    buffer.flip();
    out.write(buffer);
    buffer.compact();
}