2016-12-23 9 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을 사용하여이를 구현할 수 있습니다.

이 방법을 사용하면 실패한 소켓은 여전히 ​​오랜 시간이 걸리지 만 다른 소켓은 만들어지지 않습니다. 소켓 당 하나의 스레드를 실행할 수 있으면 모든 소켓을 만드는 데 사용되는 최대 시간보다 단일 실패 시간이 가까워집니다.

모든 소켓이 만들어 질 때까지 기다리는 것으로 구현은 현재 솔루션과의 논리적 출발이 아니며 단지 더 빠를 것입니다. 복잡성은 자체적으로 포함됩니다.

또 다른 대안은 모든 소켓이 만들어 질 때까지 기다리지 않고 모든 소켓 작성이 스레드에서 완료되도록하는 것입니다. 이는 현재 구현에서 크게 벗어나고 메소드 외부의 코드에 영향을주는 소켓 생성 스레드를 처리하는 복잡성입니다.

+0

+1 스레드에 대한 생각. 이 클래스에 대한 모든 메소드가 자바에 있다면 나는 생각하고 있었다. 그리고 질문, 한 번에 많은 스레드가 있다면 어떻게 될 것인가? JVM은 거대한 메모리를 관리해야합니다. – Mukit09

+1

@ Mukit09 스레드를 사용하는 데 메모리 오버 헤드가 있다는 것은 사실입니다. 하지만 무언가를 얻으려면 뭔가를 주어야합니다.이 경우 실행 시간이 짧아집니다. 메모리 사용량이 큰지 아닌지는 물론 스레드 수에 따라 달라집니다. 나는 OP가 100s의 소켓을 유지하려고하지 않을 것이라고 희망하고 싶습니다. 어떤 경우에는 괜찮을 것입니다. 이를위한 클래스는 100 % 확신하지 못했지만 연관성이있는 몇 가지 예제와 같이 동시성 API에 유용한 클래스가 많이 있습니다. – janos