【发布时间】:2009-11-23 17:09:05
【问题描述】:
我的印象是,在 Java 中,线程会在阻塞 I/O 操作(如 Socket.read() 或 DataGramsocket.receive() )期间暂停并让其他线程有机会做一些工作。由于某种原因,在我的多线程网络应用程序中,对 receive() 的调用导致我所有其他线程都饿死了(调用 receive() 的线程正在成为大老板并且永不放弃控制,因此永远阻塞!)
为什么会发生这种情况?我曾经有同样的应用程序,但不是 UDP,而是基于 TCP 的。 Socket.read() 总是暂停线程并允许其他人工作一段时间,如果它阻塞太久。
-- 额外信息-- 我的自定义线程的 TCP 版本是这样的代码: http://www.dwgold.com/code/proxy/proxyThread.java.txt
我的新代码(UDP 版本)几乎相同,但稍作修改以使用 UDP 方法和样式。然后我创建了其中两个线程并在两个线程上调用 start。第一个线程总是阻塞并且永远不会让另一个线程在 UDP 版本中工作。
【问题讨论】:
-
我找不到任何对 Socket.read() 方法的引用;你能指出它来自哪个包裹吗?
-
read() 在 InputStream 上定义。我想这是帖子中的错字,但我还没有找到 receive(),这既不是 InputStream 上的方法,也不是 Socket 上的方法
-
gotcha - receive() 是在 DatagramChannel 上定义的方法 :)
-
如果您从控制台运行此应用程序,请在控制台上获取线程转储。这将准确地向您展示您的线程在挨饿时正在做什么......这可能不是我们最初假设的那样。
标签: java networking multithreading udp blocking