永发信息网

ServerSocket卡在accept的时候怎么正确关闭

答案:3  悬赏:20  手机版
解决时间 2021-02-22 23:16
ServerSocket卡在accept的时候怎么正确关闭
最佳答案
加入一个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() 获取的结果。
全部回答
serverSocket会一直接受连接,直到running设为false。 但问题是如果我程序要退出了,就算把running设为false,accept也会卡在那里,所以必须再接受一次连接程序才能退出。 如果我退出时直接关闭ServerSocket比如serverSocket.close(),那么程序是可以马上结束,但是accept会抛异常,结果就是每次结束程序都有异常。
serversocket server=null; //声明一个serversocket 对象的引用server,当前该引用没有指向任何对象 socket you=null;//声明一个socket 对象的引用you,当前该引用没有指向任何对象 you=server.accept(); //调用方法。 这三句话,肯定没有连在一起的,要不然的话,会出现空指针异常。 然后回到你说的问题: you != null 是判断you是否被正确初始化,也就是说,你要操作you必须确定you不为空,才能进行。 you = null ;这是一个赋值语句。表示you当前不指向任何对象。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
废轮胎多少钱一个
漆黑魅影5.0波克基斯用什么特性好?强运(容
积累性支出包括( )。A.基本建设支出B.企业挖
王者荣耀吕布天魔缭乱多少钱
该号码的资料信息不完整,不能合账 怎么回事
求好看的BL清水虐心文
外面补漆还是去4s补漆
锡布鲁克墙纸地址在什么地方,想过去办事
有公称尺寸 孔的极限尺寸 轴的极限尺寸 还测
怎样查看创建数据库时为oracle分了多少内存
如图表示生态系统中各生物之间的关系,据图回
清韵互联网有限责任公司在什么地方啊,我要过
长安逸动什么时候二保
看图写话,风吹蒲公英100字
今年取消各省人社局盖章,软考证书还可以用来
推荐资讯
我右上方头部为什么每隔个十几秒扯痛扯
刘冬在胡歌版神话中饰演谁,名字叫什么
梁品地址有知道的么?有点事想过去
《羚羊木雕》练习题解答
二逼什么意思?
硬盘出现吱吱响声.是不是要坏了
iphone4s屏幕壁纸尺寸是多少
正方不锈钢餐具酒店用品批发地址在哪,我要去
冰箱冻肉能放多久
【大理石胶】大理石胶有没有污染和气味
lotus眼镜为何用18k金,不用24K金
黑洞匿名举报信谁写的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?