永发信息网

如何关闭一个正在accept的ServerSocket

答案:2  悬赏:10  手机版
解决时间 2021-02-06 18:15
  • 提问者网友:夢醒日落
  • 2021-02-06 00:03
如何关闭一个正在accept的ServerSocket
最佳答案
  • 五星知识达人网友:第四晚心情
  • 2021-02-06 01:28
加入一个ServerSocket正在另一个线程堵塞accept,那如何停止accept或者关闭Socket? Server socket 设置下超时 setSoTimeout 然后在Listen线程中用interrupt 其实直接close socket也可以,不过会抛出异常
全部回答
  • 1楼网友:傲气稳了全场
  • 2021-02-06 02:01
加入一个serversocket正在另一个线程堵塞accept,那如何停止accept或者关闭socket? server socket 设置下超时 setsotimeout 然后在listen线程中用interrupt 其实直接close socket也可以,不过会抛出异常,我的意思是有什么比较安全而又简单的办法?难道要加一个标志,然后要关闭的时候把标志设为stop,然后连接listernsocket?这样也未免太麻烦了 jdk5.0里面新增了java.util.concurrent包(对于多线程的开发建议尽量使用这个包),下面是javadoc里面的样例代码 用法示例 下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 executors.newfixedthreadpool(int) 工厂方法: java 代码 class networkservice implements runnable { private final serversocket serversocket; private final executorservice pool; public networkservice(int port, int poolsize) throws ioexception { serversocket = new serversocket(port); pool = executors.newfixedthreadpool(poolsize); } public void run() { // run the service try { for (;;) { pool.execute(new handler(serversocket.accept())); } } catch (ioexception ex) { pool.shutdown(); } } } class handler implements runnable { private final socket socket; handler(socket socket) { this.socket = socket; } public void run() { // read and service request on socket } } 下列方法分两个阶段关闭 executorservice。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownnow(如有必要)取消所有遗留的任务: java 代码 void shutdownandawaittermination(executorservice pool) { pool.shutdown(); // disable new tasks from being submitted try { // wait a while for existing tasks to terminate if (!pool.awaittermination(60, timeunit.seconds)) { pool.shutdownnow(); // cancel currently executing tasks // wait a while for tasks to respond to being cancelled if (!pool.awaittermination(60, timeunit.seconds)) system.err.println("pool did not terminate"); } } catch (interruptedexception ie) { // (re-)cancel if current thread also interrupted pool.shutdownnow(); // preserve interrupt status thread.currentthread().interrupt(); } } 内存一致性效果:线程中向 executorservice 提交 runnable 或 callable 任务之前的操作 happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过 future.get() 获取的结果。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯