2016-05-04 17 views
2

私はnewFixedThreadPoolを使用して、着信要求を同時にサーバーソケットに配信しています。何らかの理由で、クライアントにサービスを提供するワーカークラスが別のスレッドで実行されていません。ソケットに複数のリクエストを送信すると、リクエストは同時に処理されるのではなく、順次処理されます。私はOpenJDK 1.8.0_77を実行しています。executorserviceワーカーが別のスレッドで実行されていません

これは私のメインクラスの抜粋です。

ExecutorService executorService = Executors.newFixedThreadPool(100); 
    ServerSocket serverSocket = new ServerSocket(5656); 

    while(true) { 
     Socket socket = serverSocket.accept(); 
     executorService.execute(new ConnectionHandler(socket)); 
    } 

これは私のワーカークラスです:

public class ConnectionHandler implements Runnable { 

    private Socket socket; 

    public ConnectionHandler(Socket socket) { 
     this.socket = socket; 
    } 

    public void run() { 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e1) { 
      e1.printStackTrace(); 
     } 

     BufferedReader reader = null; 
     PrintWriter writer = null; 
     try { 
     reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     writer = new PrintWriter(socket.getOutputStream(), true); 

     while(true) { 
      String line = reader.readLine(); 
      if(line == null) break; 
      writer.println("Echo: " + line); 
     } 
     } catch (IOException e) { 
     throw new RuntimeException(e); 
     } finally { 
     try { 
      if(reader != null) reader.close(); 
      if(writer != null) writer.close(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     } 
    } 

    } 
+1

異なるスレッドを使用していないことをどのように知っていますか?スレッド名を記録してください。 –

+1

これはテストクライアントの問題ではないと確信していますか? – mtraut

答えて

0

問題はこの呼び出しである:

executorService.execute(new ConnectionHandler(socket)); 

execute方法がありますタスクが完了するまで呼び出し側のスレッドを強制的にブロックすることができます。また、呼び出し元のスレッドperfo実際の仕事。代わりに、これを実行します。

executorService.submit(new ConnectionHandler(socket)); 

これは、プール内のスレッドを使用してタスクを非同期に実行します。

+0

私はこれを信じるのに苦労しています。 ExecutorServiceのAPIドキュメントのサンプルコードはexecuteを使用しています。 –

+0

ここでjavadocを読んでください - 呼び出しスレッドを使用して作業を実行することができます: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html#execute %28java.lang.Runnable%29 – CodeBlind

+0

@NathanHughesが正しい - 2つの方法は、シグネチャだけで異なり、スレッディングに関する動作の違いはありません。 "newFixedThreadPool"で作成されたエグゼキュータは別のスレッドにタスクを配布します – mtraut

1

申し訳ありませんが、私はコンピュータで良くありません。

問題は、ソケットにループ内の多くのメッセージをエコーし​​ていたことですが、echoコマンドはメッセージを順次送信し、次のメッセージを送信する前にすべてのメッセージが終了するのを待ちます。

関連する問題