我的印象是,在 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 版本中工作。