問題タブ [completion-service]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - CompletionService:毎回リセットせずにタイムアウトをポーリングしますか?
特定の時間内に完了しなければならない一連のタスクがあり、それ以外の場合は中断します。FTPClient
特に、クラスを通じて異なるサーバーに同じファイルをアップロードします。
私の問題に対する最善の解決策だと思いましたCompletionService
が、唯一の問題はpoll
、呼び出し可能なタスクによって返されるすべての要素で使用されるタイムアウトが更新されることです。そうでない場合は申し訳ありませんが、このメカニズムを使用するのは初めてです。
とにかく、これは私が探しているものではありません。なぜなら、次に完了するタスクの上限ではなく、提出されたすべてのタスクの完了に上限を設定したいからです!
この問題の解決策/回避策はありますか?
java - CompletionService の使用中に executorService.awaitTermination を強制する
複数のタスクを送信して、利用可能なときに結果を取得しようとしています。ただし、ループの終了後、すべてのタスクが指定された時間内に完了するように強制する必要があります。そうでない場合は、エラーをスローします。最初は、executorService の invokeAll、shutdown、およびawaitTerminationの呼び出しだけで、すべてのタスクが (エラーの有無にかかわらず) 確実に完了するようにしました。CompletionServiceを使用して結果を表示するようにコードを移行しました。CompletionService 呼び出しで awaitTermination 句をどこに適用できますか?
つまり、CompletionService のタイムアウトをどのように利用できますか?
編集:
私が持っていた最初のコードは以下に表示されました。問題は、将来のリストを反復処理してから、完了したものとして出力していることです。ただし、私の要件は、FCFS ベースで完了したものを表示することです。
java - CompletionService でキャンセルされたタスクを確認する
私は CompletionService クラスを調査していますが、送信キューを完了キューから切り離すことが非常に役立つことがわかりました。
しかし、キャンセルされたタスクもポーリング/取得する方法がありません(ある意味で完了したと見なすことができます)。なんとなく簡単にできるかな?
編集:いくつかの回答を確認した後、何が起こっているのかわかりました。CompletionService は、送信されたジョブと同じ順序で返されます。ジョブ a、b、c を実行した場合。a が動作している間は b と c をキャンセルします。そして最後に completitionService をポーリングすると、タスクが終了するまで b と c のキャンセルは通知されません。また、個々のタスクをキャンセルする代わりにエグゼキューターをシャットダウンすると、アクティブなタスクがまだ終了していない間にキャンセルが完了しても、キューに残っているタスクは完了サービスに到達しないことに気付きました。
EDIT2:わかりました、テストケース全体を追加しました
次のような出力が期待されました。
しかし、代わりに次のようになりました。
PriorityBlockingQueue を CompletionService のキューとして使用しようとしましたComparator.<Future<String>,Boolean>comparing(Future::isCancelled).reversed()
が、どちらも機能しませんでした (ただし、要素の状態が変化した場合は解決しないと思います)。
java - Java メソッド内にシャットダウン フックを追加
私のコードでは、一連のスレッドを開始していくつかのタスクを実行するために CompletionService と ExecutorService を使用しています (これには多くの時間がかかる可能性があります)。ExecutorService と CompletionService を作成し、スレッドの送信を開始して結果を取得するメソッドがあります。エグゼキューターを正常にシャットダウンするために、シャットダウン フックを追加したいと思います (おそらく、エグゼキューターのシャットダウンではなくリソースの解放を処理する必要があることはわかっていますが、私の場合、各スレッドには独自のリソースがあるため、それらを正常にシャットダウンすることは良い解決策になる可能性があります)。仮定する)。
このため、次のコードを記述します
これは合理的な解決策だと思いますか、それともローカル クラスを使用してシャットダウン フックを登録および登録解除するのは安全ではないと思いますか?
前もって感謝します
よろしく
java - ProgressBar と ExecutorService
クリックすると、CompletionService のタスクの完了を追跡するために、ProgressBar を使用してダイアログを生成する必要があるボタンがあります。これを重複としてマークする前に、ProgressBarRunnable とのスレッドが分離されているため、これが EDT の問題であるとは思いません。
以下は、ボタンのクリックと関連するワーカーのコードです。