gpt4 book ai didi

java - 结束线程的执行而不使用其 stop() 方法

转载 作者:行者123 更新时间:2023-12-01 15:20:50 25 4
gpt4 key购买 nike

我有一个带有按钮的 Swing 表单,单击该按钮会启动 SocketServer,用于在单独的线程中监听传入请求。以下是我的类(class)结构。

  • MainForm :这是我启动 Swing Form 的主类。它有两个按钮,“启动服务器”和“停止按钮”。
  • MySocketServer :此类是 SocketServer 对象存在的地方,它具有方法 startServer()stopServer() >.

以下是“开始”按钮的单击事件正文。

t = new Thread(new Runnable() //Object t is created globally in this main class.
{
public void run()
{
myss = new MySocketServer(); //Object myss has similar accessibility as t.
myss.startServer();
}
});
t.start();

下面是停止按钮的点击事件主体

myss.stopServer();
if(t.isAlive());
System.out.println("Thread is still alive!!");

虽然我可以根据需要切换 SockeServer“启动”和“停止”,但我意识到每次启动服务器时,都会创建新线程,并且即使使用 MySocketServerMySocketServer< 停止服务器,它仍然保持 Activity 状态 的方法。

我可以使用 Threadstop() 并停止线程执行,但由于它已被贬值,而且我研究了一旦线程 run( ) 方法已完全执行,但我将 startServer() 方法分开,以便它可以单独处理连接的客户端。

请注意,startServer()具有While-Listen循环,因此本质上线程的run()方法处于无限执行状态,直到我显式调用stopServer() 并停止循环。

这里可以做什么?

最佳答案

首先,您不尝试使用 Thread.stop() 是正确的。这是有潜在危险的。

那么你应该做什么?

一种可能是像这样编写服务器线程:

    ....
ServerSocket ss = new ServerSocket(...);
try {
while (keepGoing) {
Socket s = ss.accept(...);
try {
// do stuff
} finally {
// close socket
}
}
} finally {
// close the server socket
}

并让stopServer清除keepGoing标志。但问题是,当线程在 accept 调用中被阻塞时,通常会发生停止,并且没有任何东西可以解除它的阻塞。

另一种可能是在线程上调用Thread.interrupt()。这会导致某些事情解除阻塞并引发异常,但我认为它不会解除 accept() 调用的阻塞。 (但是,如果“do stuff”部分需要中断,这仍然比设置标志更好。)

真正的解决方案(我认为)是关闭ServerSocket。这将导致 ss.accept() 调用解除阻塞并抛出异常,您需要在服务器线程中处理该异常。

关于java - 结束线程的执行而不使用其 stop() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10958422/

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