【问题标题】:EOS reached when two threads read from datainputstream当两个线程从 datainputstream 读取时到达 EOS
【发布时间】:2012-09-11 10:23:00
【问题描述】:

我正在编写一个程序,其中一个程序创建一个线程,该线程依次从套接字读取,我的问题是当创建两个线程时,都从数据输入流中读取。一个线程正确读取,而另一个线程遇到 EOS 并返回 -1 作为读取的字节数。我已经同步了我的运行方法

【问题讨论】:

  • 您应该只使用一个线程从流中读取,否则可能会导致混淆。您不需要同步读取,因为它已经是线程安全的。如果您收到-1,则表示流已结束。
  • read方法阻塞直到正确接收到一些流,在这种情况下它到达EOS并返回-1,这反过来又停止了整个过程
  • 这个问题只是有时会发生,有时会正常工作..这不是一直发生的问题。
  • 一个常见的错误是假设你写()的方式就是你读()的方式。有时是这样,但 read() 可能只读取一个字节,或者它可能 read() 多个 write() 的数据。这很难在线程之间进行协调。
  • 我重新启动了我的系统并且它工作了,但不知道当我重新启动程序时它是否会工作。谢谢,你能不能给我一些关于你所说的更详细的信息。 ,我的读取代码是 read(b,0,4) 其中 b 是长度为 4 的字节。

标签: java multithreading sockets datainputstream


【解决方案1】:

一定是因为第一个线程读取流直到 EOF。这是预期的行为。如果您想拆分阅读,例如在 100 字节后交换阅读器,使用 read(byte[] b, int off, int len) 否则从一个线程读取数据然后共享它。

【讨论】:

  • 我使用 0 和 4 作为我的偏移量和长度,线程同时启动并使用相同的程序读取.. 并且还从同一个套接字读取,一个线程接收数据在另一个和另一个线程使用相同的程序响应它之后
  • @Joy 你能发布源代码吗?也许线程永远不会屈服,但没有代码很难说。
【解决方案2】:

你在做什么没有意义。您不能按顺序或同时读取流两次。在这种情况下,如果线程 A 读取第一个字节,则线程 B 无法读取第一个字节。如果线程 A 读取了所有字节,则线程 B 无法读取其中任何一个。

【讨论】:

  • 这个问题只是有时会发生,有时它会正常工作..这不是一直发生的问题。所以我想我可以做到
  • @Joy 充其量你的线程会交替地从流中读取随机数的字节。他们是否能理解这一点完全取决于你如何编程。您需要以某种方式在足够高的级别上将它们相互同步,这样您就可以确保每个线程在允许另一个线程读取之前已经读取了它想要读取的内容。您获得随机行为的事实表明您还没有这样做,并且您确实只是在猜测它会在没有它的情况下工作。不会的。
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多