2

ServerSocket コンストラクターが新しいスレッドで返されない理由について、誰かが私に洞察を与えることができますか? (「Opened」メッセージがコンソールに表示されることはありません。) メイン スレッドが 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");
      }
   }

}
4

2 に答える 2

0

System.in から読み取ると、多くの問題が発生します。状況によっては、次のことができません。

  1. 一時ファイルを作成します (2 のため)
  2. マシンの Inet4Adress を読み取ります
  3. DLL をロードする

Windows Server 2003 以前で、この問題のいくつかに遭遇しました。これは、Win32-API および Java-VM のいくつかのバグが原因で発生します。

しかし、簡単な回避策があるかもしれません:

System.in.availiable() が 0 より大きい値を返す場合にのみ、System.in.read() を呼び出します。

于 2010-11-02T14:55:09.860 に答える
0

ブロックするのは ServerSocket コンストラクタではなく、System.out.println("Opened") だと思います。メイン スレッドが System.in から読み取ろうとしているという事実により、System.out での出力が妨げられます。

于 2010-10-01T05:53:16.853 に答える