1

これは以前に何度か議論されたことは知っていますが、私の問題に対する適切な解決策が見つかりません。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/ でも、なぜそれが機能しているのかわかりません。私は前にそのように試みたと確信しています。

問題が解決しました!

4

1 に答える 1

5

finallyブロックではなくブロックでリソース (ストリームとソケット) を閉じる必要があります。catchこの方法では、例外がキャッチされるかどうかに関係なく、リソースは常に閉じられます。

また、catch ブロック内またはスレッド内から呼び出すのも悪い習慣System.exit()です。エラーのインスタンスで JVM 全体を強制的にシャットダウンすることになります。これがサーバー ソケットの問題の原因である可能性があります。ストリームの読み取り/クローズで例外が発生すると、サーバー ソケットを閉じる前に JVM を終了します。

于 2011-04-06T15:49:06.007 に答える