>
면책 조항 : 저는 Java에 익숙하지 않으므로 어리석은 질문입니다. 여기로갑니다.

포트를 듣고, 연결을 수락하고, 그 일을하고, 포트를 닫는 프로그램을 작성하고 있습니다.

이것이 완전한 통신을 처리하는 자체 스레드에서 실행되기를 원합니다. 따라서 ServerSocket.accept ()는 스레드에서 시작됩니다.

그러나 쓰레드가 필요할 때만 어떻게 스폰 할 수 있습니까? ServerSocket.accept ()를 아직 사용하지 않으면 데이터를 수신하는지 알 수 없지만 주 메서드 에서이 작업을 수행하면이 파일이 열려있는 동안 새 항목을 수락 할 수 없습니다.

명확성을 위해 수입을 생략 한 일부 샘플 코드 :

public class communicator implements Runnable{
       private ServerSocket server;
       private Socket socket;
       Thread t;
       communicator(ServerSocket server){
          this.server = server;
          t = new Thread(this,"MyThread");
          t.start();
       }
       public void run() {
           try {
               socket = server.accept();
               //do stuff
               socket.close();
           } catch (IOException ex) {
               Logger.getLogger(communicator.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
}

와 주요 클래스 :

public class test {
    private static ServerSocket server;
    private static Socket socket;
    public static void main(String[] args) throws IOException{
        server = new ServerSocket(123);
        communicator comm = new communicator(server);
    }
}

또는 "한 스레드가 활성화 된 경우 새 스레드를 제공하십시오"와 같은 것을 사용할 수 있습니까?

Thx.


  • 답변 # 1

    스레드 풀과 ExecturonerService를 이와 같이 사용할 수 있습니다.

    
    public class Listener implements Runnable {
        private ServerSocket serverSocket;
        ExecutorService executorService = Executors.newCachedThreadPool();
        public Listener(ServerSocket serverSocket) {
            this.serverSocket = serverSocket;
        }
        @Override
        public void run() {
            try {
                while (true) {
                    Socket accept = serverSocket.accept();
                    executorService.execute(new Worker(accept));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    

    리스너는 연결이 올 때까지 기다렸다가 새로운 Worker 객체를 생성하고이를 실행자 서비스에 제공합니다. 이 서비스는 작업이 완료 될 때 필요한 모든 스레드를 처리하고 정리하는 데 필요한 스레드 수를 처리합니다.

    public class Worker implements Runnable{
        private Socket socket;
        public Worker(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            //do stuff
        }
    }
    
    
    

  • 이전 google play - Android 애플리케이션이 기기와 호환되지 않습니다
  • 다음 sql - Oracle에서 세부 정보를 검색하기 위해 쿼리를 단순화하는 방법은 무엇입니까?