1

Java SwingWorker として実行されているソケット サーバーを取得しました。

SwingWorker は着信接続を受信し、接続時に、接続を処理する Executor にソケットを渡します。Executor は、run() メソッドを介してソケットを処理する SocketHandler を呼び出します。

これで、GUI に停止というボタンが 1 つあります。停止ボタンを押したときに SwingWorker の実行を停止したい。そのために、Stop ボタンを押したときに呼び出される cancel(true) メソッドを用意しました。

現在、プログラムが cancel(true) メソッドを呼び出しているにもかかわらず、SocketHandler は受信データを受信し続けています。何が起きてる?

cancel(true) メソッドを呼び出しても SwingWorker が停止しないのは JDK 内のバグであるといういくつかの記事を読みました。これは本当ですか?

4

3 に答える 3

4

ループにブールチェッカーを追加するだけです

if (!stillWorking)return;

次に、ブール値を false に設定してメソッドを停止できます。

于 2011-06-08T18:52:43.750 に答える
3

の API public final boolean cancel(boolean mayInterruptIfRunning):

" mayInterruptIfRunning-trueこのタスクを実行しているスレッドを中断する必要がある場合。それ以外の場合は、進行中のタスクを完了することができます".

続きを読む必要がありますThread.interrupt。実際には何も中断しません。割り込みの処理方法をコードで指定する必要があります。

また、メインが接続を取得するのを止めたいだけなのSwingWorkerか、既存の接続もすべて強制終了したいのか、あなたの質問からは明らかではありません。

編集:while接続を受け入れるスレッドにループがある場合:

while (!Thread.interrupted()) {

で十分だと思います。がキャンセルされると、スレッドに内部割り込みフラグが設定されているSwingWorkerため、ループが停止するはずです。SwingWorker

于 2011-06-08T18:56:30.330 に答える
2

@ Yakult121これはあなたの両方の質問に対する答えではありません.SwingWorkerとJava SwingWorkerをキャンセルすると、Java SwingWorkerソケットサーバーがキャンセルされません-パブリッシュ/プロセスを使用してEDTでTextAreaを更新しますか? 、あなたの質問は十分に説明されていないと思います。重要な詳細がたくさんありません。

より良いコードを投稿する必要があります...、Executor、SwingWorker、およびそのキャンセルの実装をデモしました

あなたのコードもこの2つのスレッドに基づいている可能性があります

1/ SwingWorker のキャンセル

2/ Executor と SwingWorker

3/ そして、キャンセルのための具体的な SwingWorker のスレッドをどのように/何を決定するか

4/ 2 つのスレッドを実際にまとめる

于 2011-06-08T19:34:17.597 に答える