如何关闭一个正在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() 获取的结果。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯