我知道这已经讨论过几次了,但我找不到适合我的问题的解决方案。我想在后台运行一个 ServerSocket
线程,监听指定的端口。它实际上在工作,但只有一次。似乎服务器正在监听的端口从未正确关闭并且在我尝试重新启动时仍然处于 Activity 状态(O 不要重新启动线程本身)。有人能说出为什么它不能正常工作吗?在此先感谢您的帮助...!
编辑:
我在客户端有同样的问题。我有一个发件人线程,而且不能停止。最好的方法是什么?
ClientConnector
只是一个连接到服务器端口并发送数据的类。
它不是线程或类似的东西。
那是我的发件人类:
private class InternalCamSender extends Thread {
private int sendInterval = 500; // default 500 ms
private ClientConnector clientConn = null;
public InternalCamSender() {
this.sendInterval = getSendingInterval();
this.clientConn = new ClientConnector();
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
clientConn.sendCamPdu(CodingScheme.BER, createNewPDU());
try {
Thread.sleep(sendInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
我尝试像这样处理它的行为:
if(jButton_startSending.getText().equals(STARTSENDING)) {
new Thread() {
public void run() {
iSender = new InternalCamSender();
iSender.start();
jButton_startSending.setText(STOPSENDING);
}
}.start();
} else {
new Thread() {
public void run() {
if(iSender.isAlive()) {
iSender.interrupt();
try {
iSender.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
iSender = null;
jButton_startSending.setText(STARTSENDING);
}
}.start();
}
不知何故,我无法像那样停止 InternalCamSender
。我之前尝试过 volatile boolean
,是一样的。我读了http://download.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html页面并尝试了示例 我应该使用什么代替 Thread.stop? 但即使那样也没有停止线程?我迷路了。
有什么想法吗?
编辑: 在这里找到我的 clinet 发送问题的答案 http://www.petanews.de/code-snippets/java/java-threads-sauber-beenden-ohne-stop/ 即使我不知道为什么会这样。我确信我以前尝试过这种方式。
问题解决了!
最佳答案
您应该在 finally
block 中关闭您的资源(流和套接字),而不是在 catch
block 中 - 这样资源总是关闭的,无论是异常是否被抓到。
从 catch block 内或线程内调用 System.exit()
也是一种不好的做法 - 您会在出现任何错误时强行关闭整个 JVM。这也可能是您的服务器套接字问题的原因 - 每当读取/关闭流时遇到任何异常,您将在有机会关闭服务器套接字之前退出 JVM。
关于java - 如何正确停止ServerSocket线程?关闭套接字失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5569226/