任何人都可以让我深入了解为什么ServerSocket构造函数永远不会在新线程中返回? (我从未看到打开到控制台的“已打开”消息。)似乎主线程通过过快地进入readLine来阻止服务器套接字线程运行:
public class Main
{
public static void main(String[] args) throws IOException
{
new Thread(new SocketOpener()).start();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inLine = br.readLine();
System.out.println(inLine);
}
}
public class SocketOpener implements Runnable
{
public void run()
{
try
{
System.out.println("Opening...");
ServerSocket socket = new ServerSocket(4444);
System.out.println("Opened");
}
catch (IOException ex)
{
System.out.println("IO Error");
}
}
}
答案 0 :(得分:0)
我认为它不是阻塞的ServerSocket构造函数,而是System.out.println(“Opened”)。主线程试图从System.in读取的事实阻止了在System.out上完成输出。
答案 1 :(得分:0)
从System.in读取会导致很多问题: 在某些情况下,你不能:
我遇到过Windows Server 2003及更早版本的一些问题。这是因为Win32-API和Java-VM中存在一些错误。
但可能有一个简单的工作方式:
如果System.in.availiable()返回大于0的值,则仅调用System.in.read()。