gpt4 book ai didi

java - 停止 ServerSocket accept() 循环线程

转载 作者:可可西里 更新时间:2023-11-01 02:49:46 24 4
gpt4 key购买 nike

我正在实现一个非常基本的 API 以更好地控制 ServerSocket 和套接字,但我遇到了一个非常奇怪的问题,由于我缺乏线程知识而无法解决。让我解释一下。

在我的 SocketStreamReceiver 类中,我使用辅助线程通过 ServerSocket#accept() 监听新套接字。有两种方法:客户端可以使用 start() 和 stop() 来启动(创建线程并开始使用 accept() 进行监听)和停止(关闭 ServerSocket 并销毁线程)我的SocketStreamReceiver.

您将如何实现 stop() 方法? 请记住,stop() 可以在 doSomething() 内部调用,在由 start() 启动的同一个辅助线程中。您可以根据需要更改任何内容:如果需要,您可以在线程内创建 ServerSocket,就在 while(运行)之前。

public class SocketStreamReceiver{
...
private Thread thread;
private ServerSocket server;
private boolean running;
...

public void start () throws IOException{
if (thread != null) return;

server = new ServerSocket (port);
thread = new Thread (new Runnable (){
@Override
public void run (){
try{
while (running){
Socket socket = server.accept ();
doSomething (socket);
}
}catch (SocketException e){
...
}catch (IOException e){
...
}
}
}, "SocketStreamReceiver");
thread.start ();
}

public void stop () throws IOException{
if (thread == null) return;

//code...

thread = null;
}
}

谢谢。

编辑 - 解决方案:

public class SocketStreamReceiver{
private Thread thread;
private ServerSocket server;
private volatile boolean running;
...

public synchronized void start () throws IOException{
if (thread != null) throw new IllegalStateException ("The receiver is already started.");

server = new ServerSocket (port);
thread = new Thread (new Runnable (){
@Override
public void run (){
try{
running = true;
while (running){
doSomething (server.accept ());
...
}
}catch (SocketException e){
...
}catch (IOException e){
...
}
}
}, "SocketStreamReceiver");
thread.start ();
}

public synchronized void stop (){
if (thread == null) return;

running = false;
try{
if (server != null){
server.close ();
}
}catch (IOException e){}

thread = null;
}
}

最佳答案

我会做

public void stop() {
running = false;
try{
if (server != null) server.close ();
} catch (IOException ignored){
}
}

看来您甚至不需要运行标志。但是我会在您的服务器接受代码中使用它来确定是否需要异常。即当运行 == false 时忽略所有异常。

我会让 running 不稳定。

如果您可以从不同的线程运行它们,我会让 start()/stop() 同步。

关于java - 停止 ServerSocket accept() 循环线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5660390/

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