java调用OutputStream接口中flush方法,真的会立即刷新吗?
来源:互联网 发布:jsp网上图书系统源码 编辑:程序博客网 时间:2024/05/16 07:16
自己最近在做一个项目和socket通信有关,其中有段逻辑是这样的。其中我是发送方,另一个是接收方。
第一步:发送方向接收方发送一段消息。
第二步:接收方回复消息。消息内容为:发送方消息否发送成功。如果成功,接收方会再回复一条消息,消息内容为:执行发送方消息后的结果。
其中,接收方每次发送消息后,都会调用flush方法。因此,我作为接收方,使用了两次read方法来读取消息。
紧接着,bug就产生了。但这个bug不是总是出现,而是偶尔出现。后来在debug的过程中发现。原来我第一个read方法,读到回复的消息并不一定是接收方回复的“消息是否发送成功”这一条,时长也会读到接收方回复的两条消息:包括“消息是否发送成功”和“执行结果”。因此,我第二个read方法,再去读管道中已经没有消息了,因此,线程一直处于等待接受消息的挂起状态。
后来,在看官方的api的过程中发现flush方法大致描述如下:flush方法会将缓存中的数据立即强制刷新,而这些被强制刷新的数据会交给操作系统,至于操作系统什么时候讲这些输入写到管道中,这并不是我们能控制的。
因此,在我的项目中,虽然接收方每次都调用flush方法,但不保证这个消息立即被发送给发送方,什么时候发送给发送方是由操作系统决定的。因此,这个bug并不总是出现。
后来,我作为发送方在第一次read的时候,加入了接受到的消息数目判断,解决了这个bug。
阅读全文
0 0
- java调用OutputStream接口中flush方法,真的会立即刷新吗?
- 深入解析Java中Flushable接口的flush方法
- java.io.OutputStream.flush()
- java类中声明的立即赋值的成员变量,真的立即赋值了吗?
- 对OutputStream类的flush()方法的误解
- 对OutputStream类的flush()方法的误解
- java 中flush()方法
- java中 flush()方法
- outputstream 的flush 为空
- 立即刷新Chrome浏览器缓存的方法
- java中outputstream以及其子类 flush有什么作用呢
- 关于java I/O中flush方法作用的理解
- hibernate flush 机制与调用 saveOrupdate 后不立即打印 sql 的问题
- Kotlin真的会取代JAVA吗?
- Kotlin真的会取代JAVA吗?
- Kotlin真的会取代JAVA吗?
- 你真的会写Java吗?
- 你真的会写Java吗?
- ES6-函数的扩展-尾调用优化
- 系统学习java高并发系列二
- 什么是多态?为什么用多态?有什么好处?多态在什么地方用?
- 如何正确判断 Android应用是第一次启动的靠谱方案(短篇)
- C语言的函数定义和函数声明
- java调用OutputStream接口中flush方法,真的会立即刷新吗?
- codeforce 884C
- ROS中几种常用的msg
- 平衡二叉树
- 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题
- linux常用命令
- VS2017安装ImageWatch
- Memcached入门学习四(spring 集成MemCached)
- Android判断手机是否安装微信(总结)