2016-12-23 4 views
4
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     List<Socket> socketList = new ArrayList<>(); 
     for (String ip: iplist) { 
      Socket socket = null; 
      try { 
       socket = new Socket(ip,23); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      socketList.add(socket); 
     } 
    } 
}).start(); 

iplistの各IP用に新しいソケットを作成し、そのソケットをsocketsのリストに追加しようとしています。私はこれのforループを使用しています。 try ... catchを使用すると、ソケット接続が失敗したときに、ループ実行が長時間停止します。ソケットの接続が失敗したことを知り、ソケットのリストにnullソケットを追加することでループの実行を継続させるためには、より良い選択肢が必要です。`try ... catch`メソッドを使わずに一定時間後にforループを続けるには?

答えて

4

あなたはこれを行うことができます:

  • は、各ソケットを作成するための別のスレッドを使用してください。
  • のように、ソケットを格納するために(Listの代わりに)同時収集を使用します。
  • すべてのソケット作成者スレッドが完了するのを待ってから、必要に応じてコンカレントリストのすべての要素を通常のListに追加します。たとえば、CompletionServiceを使用してこれを実装できます。

この方法では、失敗したソケットはまだ時間がかかりますが、他のソケットの作成はブロックされません。ソケットごとに1つのスレッドを実行できる場合、すべてのソケットを作成するために使用される最大時間よりも、単一の失敗の時間が近くなります。

すべてのソケットが作成されるまで待つことで、実装は現在のソリューションからの論理的な離脱ではなく、単なる高速化であり、複雑さは自己完結型です。

もう1つの方法は、すべてのソケットが作成されるまで待つことではなく、すべてのソケット作成をそのスレッドで完了させることです。これは現在の実装とは大きく異なり、メソッド外のコードに影響を及ぼすソケット作成スレッドの処理が複雑になります。

+0

スレッドを考える上で+​​1。私はそこにjavaのための任意のクラス/メソッドがあると思っていた。そして、一度に多くのスレッドがある場合はどうなるのでしょうか? JVMは大量のメモリを管理する必要があります。 – Mukit09

+1

@ Mukit09スレッドを使用するのにメモリオーバーヘッドがあることは事実です。しかし、何かを得るために何かを与える必要があります。この場合、実行時間は短くなります。メモリ使用量が膨大かどうかはスレッドの数に依存します。私は、OPが100のソケットを生かし続けるつもりはないと願っています。その場合、それはうまくいくはずです。このクラスについては、あなたが意味することを100%確信しているわけではありませんが、関連するいくつかの関連する例など、並行性APIには多くの有用なクラスがあります。 – janos

関連する問題