これは以前に何度か議論されたことは知っていますが、私の問題に対する適切な解決策が見つかりません。ServerSocket
指定されたポートをリッスンして、バックグラウンドでスレッドを実行したい。実際には機能していますが、一度だけです。サーバーがリッスンしているポートが正しく閉じられず、再起動しようとしてもアクティブになっているようです (スレッド自体を再起動しないでください)。正しく動作しない理由を教えてもらえますか? 助けてくれてありがとう...!
編集:
クライアント側でも同じ問題があります。送信者スレッドがあり、そのスレッドを停止することはできません。それを行う最善の方法は何ですか?
は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 の代わりに何を使用すればよいですか? も試しました。しかし、それでもスレッドを停止していませんでしたか? 迷っています。
何か案は?
編集: ここでクリネット送信の問題の答えを見つけましたhttp://www.petanews.de/code-snippets/java/java-threads-sauber-beenden-ohne-stop/ でも、なぜそれが機能しているのかわかりません。私は前にそのように試みたと確信しています。
問題が解決しました!