如何关闭一个正在accept的ServerSocket?

加入一个ServerSocket正在另一个线程堵塞accept,那如何停止accept或者关闭Socket?

Server socket 设置下超时
setSoTimeout
然后在Listen线程中用interrupt

其实直接close socket也可以,不过会抛出异常,我的意思是有什么比较安全而又简单的办法?难道要加一个标志,然后要关闭的时候把标志设为stop,然后连接listernSocket?这样也未免太麻烦了

JDK5.0里面新增了java.util.concurrent包(对于多线程的开发建议尽量使用这个包),下面是javadoc里面的样例代码

用法示例

下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int) 工厂方法:

 
 
java 代码
 
  1. class NetworkService implements Runnable {  
  2.    private final ServerSocket serverSocket;  
  3.    private final ExecutorService pool;  
  4.   
  5.    public NetworkService(int port, int poolSize)  
  6.        throws IOException {  
  7.      serverSocket = new ServerSocket(port);  
  8.      pool = Executors.newFixedThreadPool(poolSize);  
  9.    }  
  10.   
  11.    public void run() { // run the service  
  12.      try {  
  13.        for (;;) {  
  14.          pool.execute(new Handler(serverSocket.accept()));  
  15.        }  
  16.      } catch (IOException ex) {  
  17.        pool.shutdown();  
  18.      }  
  19.    }  
  20.  }  
  21.   
  22.  class Handler implements Runnable {  
  23.    private final Socket socket;  
  24.    Handler(Socket socket) { this.socket = socket; }  
  25.    public void run() {  
  26.      // read and service request on socket  
  27.    }  
  28. }  

下列方法分两个阶段关闭 ExecutorService。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownNow(如有必要)取消所有遗留的任务:

 
 
java 代码
 
  1. void shutdownAndAwaitTermination(ExecutorService pool) {  
  2.   pool.shutdown(); // Disable new tasks from being submitted  
  3.   try {  
  4.     // Wait a while for existing tasks to terminate  
  5.     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {  
  6.       pool.shutdownNow(); // Cancel currently executing tasks  
  7.       // Wait a while for tasks to respond to being cancelled  
  8.       if (!pool.awaitTermination(60, TimeUnit.SECONDS))  
  9.           System.err.println("Pool did not terminate");  
  10.     }  
  11.   } catch (InterruptedException ie) {  
  12.     // (Re-)Cancel if current thread also interrupted  
  13.     pool.shutdownNow();  
  14.     // Preserve interrupt status  
  15.     Thread.currentThread().interrupt();  
  16.   }  
  17. }  

内存一致性效果:线程中向 ExecutorService 提交 RunnableCallable 任务之前的操作 happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过 Future.get() 获取的结果。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值