問題タブ [executor]
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 - Javaエグゼキュータ:タスクが完了したときに、ブロックせずに通知を受ける方法は?
エグゼキュータサービスに送信する必要のあるタスクでいっぱいのキューがあるとします。一度に1つずつ処理してほしい。私が考えることができる最も簡単な方法は次のとおりです。
- キューからタスクを取得します
- エグゼキュータに送信します
- 返されたFutureで.getを呼び出し、結果が利用可能になるまでブロックします
- キューから別のタスクを取得します...
ただし、完全にブロックしないようにしています。タスクを一度に1つずつ処理する必要がある、そのようなキューが10,000ある場合、それらのほとんどがブロックされたスレッドを保持するため、スタックスペースが不足します。
私が欲しいのは、タスクを送信し、タスクが完了したときに呼び出されるコールバックを提供することです。そのコールバック通知をフラグとして使用して、次のタスクを送信します。(functionaljavaとjetlangは明らかにそのような非ブロッキングアルゴリズムを使用していますが、私はそれらのコードを理解できません)
独自のエグゼキュータサービスを作成する以外に、JDKのjava.util.concurrentを使用してこれを行うにはどうすればよいですか?
(これらのタスクを提供するキュー自体がブロックされる可能性がありますが、それは後で取り組むべき問題です)
java - TaskExecutorの例を使用した優れたSpringスレッドはありますか?
トランザクション管理にSpringを使用するJavaアプリケーションでスレッド化を実装する方法を理解しようとしています。SpringのドキュメントでTaskExecutorセクションを見つけましたが、ThreadPoolTaskExecutorは私のニーズに合うように見えます。
ThreadPoolTaskExecutor
この実装は、Java 5環境でのみ使用できますが、その環境で最も一般的に使用される実装でもあります。java.util.concurrent.ThreadPoolExecutorを構成するためのBeanプロパティを公開し、それをTaskExecutorでラップします。ScheduledThreadPoolExecutorなどの高度なものが必要な場合は、代わりにConcurrentTaskExecutorを使用することをお勧めします。
しかし、どうやって使うのかわかりません。私はしばらくの間良い例を探していましたが、運がありませんでした。誰かが私を助けることができれば私はそれをいただければ幸いです。
java - ThreadPool は、Polling のように Executor に対してですか?
Java の Executor は (私が理解している限り) ThreadPool の概念を抽象化したものであり、タスクを受け入れて実行 (実行) できるものです。
ポーリングの概念について同様の例外を探しています。特定の Queue (これは を実装していません BlockingQueue
) からアイテムを継続的にポーリング (デキュー) し、それらを実行してスリープ状態にし、シャットダウンするまでこれをすべて繰り返す必要があります。
既製の抽象化はありますか、それとも自分で何かを書く必要がありますか?
(より良いタイトルの提案は大歓迎です)
java - いつJavaのThreadoverExecutorを使用する必要がありますか?
エグゼキュータはクリーンな抽象化のようです。より堅牢なエグゼキュータに依存するのではなく、スレッドを直接使用したいのはいつですか?
java - Java のエグゼキュータとデーモン
アプリがサーバーを介して読み込まれるときにインスタンス化する MyThread オブジェクトがあり、それをデーモン スレッドとしてマークしてから呼び出しますstart()
。スレッドは、アプリケーションがアクティブである限り、キューからの情報を待ちます。私の問題/質問は次のとおりです。現在、MyThread は Thread を Daemon としてマークしているため、Thread を拡張しています。だから私が尋ねたかったのは、MyThread が Thread を拡張する代わりに Runnable を実装するかどうか (そしてもちろん名前が変更されるかどうか) でありnewSingleThreadScheduledExecutor()
、どのように、何を、またはどこで、何かを Daemon としてマークするかを使用します。マルチスレッド環境のいくつかの部分は私にとって非常に新しいものであるため、用語を混乱させていないことを願っています。
ありがとう
更新: 私のアプリで参照しているモジュールは、実際にはこの種のスレッドがいくつかある Web アプリであり、それらに共通しているのは、ServletContext
さまざまな理由ですべてがメンバーとして含まれていることです。現在、私はこれを memebr として拡張Thread
しWebThread
ており、ServletContext
すべてのサブクラスがこれを利用できます。Executor と ThreadFactory を使用して Runnable パラダイムに切り替える場合、基本的には、WebRunnable
実装Runnable
とをServletContext
パブリック メンバーとして持つ醜いハイブリッドが必要であり、ThreadFactory
実装newThread(WebRunnable arg0)
に加えて実装が必要newThread(Runnable arg0)
です。何が一番いいのかわからない。ありがとう
java - Java Scheduled Executor:タスクがまだ終了していない場合、並行して実行されないことを保証しますか?
java.util.concurrent パッケージの次の Java メソッドがScheduledExecutorService.html#scheduleAtFixedRate()
「最後の」実行からの実行可能ファイルがまだ終了していない場合に、スケジュールされた実行可能ファイルが並行して実行されないことを絶対に保証します。
たとえば(疑似コード)
どうもありがとうジャン
java - Javaでスケジュールされたエグゼキュータで未処理の例外
私は次の問題を抱えています、そして私は正確に何が起こるか知りたいです。私はJavaのScheduledExecutorServiceを使用して、5分ごとにタスクを実行しています。それは非常にうまく機能します。エグゼキュータは、Javaでのスレッドプログラミングの方法を完全に変えました。
ここで、Java Docを参照して、スケジュールされたタスクが未処理の例外で失敗した場合の動作について説明しましたが、何も見つかりませんでした。
次のスケジュールされたタスクはまだ実行されますか?未処理の例外がある場合、スケジュールされたエグゼキュータはタスクのスケジュールを停止しますか?誰かがこの単純な問題に関する情報を指摘できますか?
どうもありがとう。
java - ThreadPoolExecutorのキューに入れられたすべてのタスクを削除する
ThreadPoolExecutorについてこのかなり単純な質問があります。次の状況があります。キューからオブジェクトを消費し、それらに適切なワーカータスクを作成して、ThreadPoolExecutorに送信する必要があります。これは非常に簡単です。ただし、シャットダウンシナリオ内では、多くのワーカーが実行キューに入れられる場合があります。これらのタスクの1つが1時間実行されている可能性があり、アプリケーションを比較的高速で正常にシャットダウンする必要があるため、既に処理中のタスクを正常に完了する必要があるときに、キューに入れられたすべてのタスクをThreadPoolExecutorから破棄します。
ThreadPoolExecutorのドキュメントにはremove()メソッドがありますが、削除できるのは特定のタスクのみです。パージ()は、すでにキャンセルされた将来のタスクに対してのみ機能します。私のアイデアは、キューに入れられたすべてのタスクを保持しているキューをクリアすることでした。ThreadPoolExecutorはこの内部キューへのアクセスを提供しますが、ドキュメントには次のように記載されています。
getQueue()メソッドを使用すると、監視とデバッグを目的としたワークキューへのアクセスが可能になります。この方法を他の目的に使用することは強くお勧めしません。
したがって、このキューを取得してクリアすることはできません。また、このドキュメントの抜粋には次のように書かれています。
提供されている2つのメソッド、remove(java.lang.Runnable)とpurge()を使用して、キューに入れられた多数のタスクがキャンセルされた場合のストレージの再利用を支援します。
どのように?確かに、エグゼキュータに送信したすべてのタスクのリストを維持できます。シャットダウンの場合は、すべてのエントリを繰り返し処理し、remove()メソッドを使用してThreadPoolExecutorから削除します...しかし...さあ、これはこのリストを維持するためのメモリの浪費と面倒。(たとえば、すでに実行されたタスクを削除する)
ヒントや解決策に感謝します!
java - Executors から RuntimeExceptions を適切にキャッチする方法は?
次のコードがあるとします。
myRunnable
がをスローした場合、どうすればRuntimeExcpetion
それをキャッチできますか? 1 つの方法は、独自のThreadFactory
実装を提供し、そこから出てくる s のnewSingleThreadExecutor()
カスタムuncaughtExceptionHandler
s を設定することです。Thread
もう 1 つの方法は、try-catch ブロックを含むmyRunnable
ローカル (匿名) にラップすることです。Runnable
他にも同様の回避策があるかもしれません。でも…なんだか汚い感じがして、こんなに複雑にならないように感じます。きれいな解決策はありますか?
java - エグゼキュータのすべてのスレッドが終了するのを待ちますか?
私はプログラミングの練習としてparellelクイックソートを実装しています。終了後、ExecutorsのJavaチュートリアルページを読みました。これにより、コードがさらに高速化されるようです。残念ながら、すべてがソートされるまでプログラムが続行されないようにするために、join()に依存していました。現在、私は以下を使用しています:
これは問題なく機能しているようですが、非再帰的なquicksort()メソッドを呼び出した直後にe.shutdown()を実行すると、RejectedExecutionExceptionsが多数あるため、これは期待どおりに機能していないと思います。
とにかく、私は基本的にleftThread.join()と同じ機能を取得しようとしていますが、Executorを使用しています。私の質問は、
すべてのスレッドが完了するまで待つのに最適な方法ですか?
編集:わかりました。Executorをシャットダウンした後に大量のエラーが発生した理由を理解しました。これは、この関数をループで呼び出していて(実行時間を均等にするため)、新しいExecutorを作成していなかったためです。