スレッドプールサイズが1のThreadPoolExecutorを使用して、スイングワーカーを順番に実行しています。イベントが到着し、クライアントとサーバー間の通信を行うスイングワーカーを作成し、そのあとでui(done()メソッド内)を更新する特殊なケースがあります。ThreadPoolExecutorでのSwingWorkerのキャンセル
たときに、ユーザー火災(アイテムをクリックする)いくつかのイベントではなく、それらの多くが発生した場合、これが正常に動作します。しかし、これは私が現在実行中のすべてのスケジュールされた労働者を取り消す必要があるので起こります。問題は、ThreadPoolExecutorをサポートしているキューがSwingWorkerのキャンセル処理を認識していないことです(少なくともそのように思われます)。スケジュールされた労働者はキャンセルされますが、すでに稼働している労働者は就労しませ
したがって、キャンセルされていない限りすべてのワーカーの参照を保持するタイプ<T extends SwingWorker>
の並行キューを追加しました。新しいイベントが到着したときにキュー内のすべてのSwingWorkersで.cancel(true)が呼び出され、 SwingWorkerをThreadPoolExecutorに追加します。
概要:SwingWorkersが作成され、単一のスレッドでThreadPoolExecutorで実行されます。最後に送信されたワーカーのみが実行されている必要があります。
は、この問題を解決するためのいずれかの選択肢があります、またはそれはこのようにそれを行うには「OK」とは?興味があるだけ
...
動作しますか?それが壊れていない場合は、それを修正しないでください(またはそれまで笑ってください) – Gandalf
はい、それは動作します。しかし、並行コードの作成は難しいです。自分の仕事のコンセプトが存在するかどうかを知りたいだけです。 – MrWhite