gpt4 book ai didi

java - AsynchronousServerSocketChannel 最终 block 从未执行

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:10 24 4
gpt4 key购买 nike

我创建了AsynchronousServerSocketChannel,一切都很好,直到我想要关闭服务器套接字套接字。我在客户端上创建 AsynchronousSocketChannel 并使用特殊消息调用函数来关闭服务器和所有套接字 channel ,服务器已关闭但最终 block 从未执行为什么?

检查代码:

 public void openServerSocket(int sport) {


port = sport;
policyFile = createPolicy(new String[]{"*:"+port});
try {

//group = AsynchronousChannelGroup.withThreadPool(Executors.newSingleThreadExecutor());
//group.awaitTermination(1, TimeUnit.SECONDS);
server = AsynchronousServerSocketChannel.open();
server.bind(new InetSocketAddress(sport));


server.accept(null, this);

while(isOpen) {

//System.out.println("running server socket");

}
}catch(Exception ex) {
this.message = ex.getMessage();
System.out.println("Server: " + ex.getMessage());
}finally {

System.out.println("Finall serversocket closing!");
for(SocketHandler sh : sockets) {
sh.close();
}

if(server != null) {
try {
server.close();
server = null;
}catch(Exception ex2) {
this.message = ex2.getMessage();
}
}


sockets.clear();
sockets = null;
//this.message = "server socket closed";

System.out.println("server socket down");
}

}

@Override
public void completed(AsynchronousSocketChannel socket, Void attachment) {

System.out.println("new connection");
SocketHandler sh = new SocketHandler(socket, this);

server.accept(null, this);
}

@Override
public void failed(Throwable exc, Void attachment) {

System.out.println("Server Failed accept:" + exc.getMessage());
}


public void closeServerSocket() {

System.out.println("Closing server socket! " + server);
this.isOpen = false;

}

所以函数 closeServerSocket 被调用,我将 false 设置为变量 isOpen ,它继续循环,但是当我将 false 设置为 isOpen var 时, while 仍在循环,finally 从未执行?

最佳答案

这看起来像是多个线程之间的通信问题。从代码中我猜测您的 while(isOpen) 循环与类的 closeServerSocket() 方法在不同的线程中运行。要验证这一点,请将 Thread.currentThread() 添加到您的打印语句中。

如果是这种情况,您可以通过将 isOpen 声明为 volatile 来补救这种情况。如果没有 volatile ,则无法保证任何其他线程是否以及何时会看到写入的值。使用 volatile 可以保证(我对 happens-before 的解释)访问变量的线程稍后(根据挂钟时间)将看到更改后的值。

您可能更喜欢AtomicBoolean,而不是 volatile

关于java - AsynchronousServerSocketChannel 最终 block 从未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23291426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com