为什么"管道化" CharBuffer挂起?
时间:2020-03-06 14:40:07 来源:igfitidea点击:
为什么以下方法会挂起?
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while( in.read(buf) >= 0 ) { out.append(buf.flip()); } }
解决方案
回答我自己的问题:我们必须在read
s之间调用buf.clear()
。据推测,因为缓冲区已满,所以" read"正在挂起。正确的代码是
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while( in.read(buf) >= 0 ) { out.append(buf.flip()); buf.clear(); } }
我认为这是一个僵局。 in.read(buf)锁定CharBuffer并阻止out.append(buf)调用。
假设CharBuffer在实现中使用了某种锁。 API对类CharBuffer说什么?
编辑:对不起,我的大脑出现某种短路...我将其与其他东西混淆了。