如何终止由于Socket.accept()而被阻塞太长时间的线程?

问题描述 投票:0回答:1
public class Slave implements Runnable {
   public ServerSocket slaveSocket;

   public Slave(ServerSocket sk) {socket = sk;}

   @Override
   public void run() {
      Socket client = slaveSocket.accept(); // slave will wait to serve a client
      // more code...

      Socket clientPart2 = slaveSocket.accept();
      // more code...
   }
}

public class Server {
   public static void main(String[] args) {
       // for example only, incomplete code
       ServerSocket serverSocket = new ServerSocket(0); // a client connect to 8088
       Slave slave = new Slave(serverSocket);
       new Thread(slave).start(); // slave serve the current client, the server wait for new client

       // send new slave's port to client ... 
   }
}

因此,我有一台服务器,可同时为多个客户端提供服务。每当客户端连接时,服务器都会创建一个新的Slave,将该从服务器的IP /端口发送给客户端,然后客户端将与从服务器一起工作。

但是,如果客户端收到从站的地址,则什么也不做(或退出),slaveSocket.accept()导致该从站线程永远运行,这很浪费。

我希望从属线程在等待slaveSocket.accept() 30秒后退出。由于slaveSocket.accept()正在阻止,因此我无法从void run()内部执行此操作。

解决此问题的正确,干净的方法是什么?谢谢。

java multithreading sockets runnable blocking
1个回答
0
投票

[看一下返回AsynchronousServerSocketChannel's acceptFuture方法。然后,Future有一个getter with timeout,可以完成您要问的事情。

注意:您可能会读到related tutorial

然后,吸气剂将通过与工作线程中的阻塞方法一起使用的相应AsynchronousSocketChannelChannels.newInputStream方法返回一个Channels.newInputStream,该Channels.newOutputStream可以转换返回阻塞。

© www.soinside.com 2019 - 2024. All rights reserved.