首页 > 解决方案 > Java:在需要时生成一个接受套接字的线程?

问题描述

免责声明:我对 Java 还很陌生,所以也许这是一个愚蠢的问题。开始了。

我正在编写一个侦听端口、接受连接、执行其操作并关闭端口的程序。

我希望它在它自己的线程中运行,该线程处理完整的通信。因此,ServerSocket.accept() 将在线程中启动。

但是如果我需要它,我怎样才能只产生一个线程呢?如果我还没有使用 ServerSocket.accept(),我不知道我是否收到了数据,但是如果我在 main 方法中这样做,我将无法在这个打开时接受一个新的。

为了清楚起见,一些示例代码省略了导入:

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);
    }
}

或者也许我可以使用类似“如果一个线程处于活动状态,则提供一个新线程”之类的东西?

谢谢。

标签: javamultithreadingsockets

解决方案


您可以使用类似这样的 Threadpools 和 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
    }
}


推荐阅读