ServerSocket被线程从控制台寻求输入阻止

时间:2010-10-01 05:35:43

标签: java multithreading blocking serversocket

任何人都可以让我深入了解为什么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");
      }
   }

}

2 个答案:

答案 0 :(得分:0)

我认为它不是阻塞的ServerSocket构造函数,而是System.out.println(“Opened”)。主线程试图从System.in读取的事实阻止了在System.out上完成输出。

答案 1 :(得分:0)

从System.in读取会导致很多问题: 在某些情况下,你不能:

  1. 创建临时文件(因为2)
  2. 阅读机器的Inet4地址
  3. 加载DLL
  4. 我遇到过Windows Server 2003及更早版本的一些问题。这是因为Win32-API和Java-VM中存在一些错误。

    但可能有一个简单的工作方式:

    如果System.in.availiable()返回大于0的值,则仅调用System.in.read()。