ByteBuffer.getInt() 是不是阻塞? [关闭]

Posted

技术标签:

【中文标题】ByteBuffer.getInt() 是不是阻塞? [关闭]【英文标题】:Is ByteBuffer.getInt() blocking? [closed]ByteBuffer.getInt() 是否阻塞? [关闭] 【发布时间】:2013-04-04 15:59:48 【问题描述】:

我愿意使用ByteBuffer 来进行 JNI 和 C++ 的线程间通信。我在文档中找不到 ByteBuffer 的 getInt() 是否阻塞。那么,我是否需要做类似的事情:

if(byteBuffer.asIntBuffer().hasRemaining())
    byteBuffer.getInt();
Thread.sleep(1000);

byteBuffer.getInt();

会阻塞所以不需要睡眠?

【问题讨论】:

它不是流,它不等待任何输入,它只是读取一个固定的内存位置。 有道理,谢谢! ByteBuffers 根本没有同步;它们不是线程安全的。 @Louis 他们不是原子的?什么意思? @quimnuss:不,它们不是原子的。 ByteBuffer 没有任何线程安全性。如果没有记录,则不存在。 【参考方案1】:

根据the documentation,如果缓冲区中没有至少四个字节,它将抛出BufferUnderflowException。这表明它不会阻塞(就像“阻塞”这个词根本没有出现在其文档页面上一样)。

但请注意,您的sleep 解决方案将不起作用,因为您正在执行sleep 调用 调用getInt,如果没有'还没有足够的数据。在调用getInt 之前,您需要确保缓冲区中至少有四个字节

【讨论】:

是的,实际代码更长。你是对的,摘录可能具有误导性。固定。

以上是关于ByteBuffer.getInt() 是不是阻塞? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

检查非阻塞发送是不是成功

主线程是不是在阻塞线程上运行?

TryExecuteTask(task) 是不是总是阻塞?

如果 winsock2 套接字是非阻塞的,与之关联的 SSL 对象是不是也会表现出非阻塞行为?

C、是不是可以阻塞进程直到管道再次打开?

从并发队列中调用 dispatch_sync - 它是不是完全阻塞?