タグ付けされた質問 「executorservice」

25
ExecutorServiceを使用して、すべてのスレッドが完了するのを待つ方法は?
次のように、一度にいくつかのタスクを4回実行する必要があります。 ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } //...wait for completion somehow それらがすべて完了したら、どうすれば通知を受け取ることができますか?今のところ、いくつかのグローバルタスクカウンターを設定し、すべてのタスクの終わりにそれを減らすことよりも良いことを考えることはできません。その後、無限ループでこのカウンターを監視して0にします。または、Futureのリストを取得し、それらすべてに対して無限ループモニターisDoneを実行します。無限ループを含まないより良い解決策は何ですか? ありがとう。

6
Javaタイマーvs ExecutorService?
を使用してタスクをスケジュールするコードがありますjava.util.Timer。私は周りを見回してExecutorServiceいて、同じことができるのを見ました。ここでこの質問です。タスクをスケジュールして使用TimerしたExecutorServiceことがありますが、あるタスクを別のタスクよりも優れている点は何ですか。 また、誰かがTimerクラスを使用したかどうかを確認し、ExecutorService解決された問題に遭遇しました。

17
ExecutorServiceのスレッドとスレッドプールの命名
そのExecutorようなフレームワークを利用するアプリケーションがあるとしましょう Executors.newSingleThreadExecutor().submit(new Runnable(){ @Override public void run(){ // do stuff } } このアプリケーションをデバッガーで実行すると、次の(デフォルト)名でスレッドが作成されますThread[pool-1-thread-1]。ご覧のとおり、これはそれほど有用ではなく、私が知る限り、Executorフレームワークは作成されたスレッドまたはスレッドプールに名前を付ける簡単な方法を提供していません。 では、どのようにしてスレッド/スレッドプールの名前を提供するのでしょうか?例えば、Thread[FooPool-FooThread]。

12
Java ExecutorServiceタスクからの例外の処理
JavaのThreadPoolExecutorクラスを使用して、多数の重いタスクを一定数のスレッドで実行しようとしています。各タスクには、例外のために失敗する可能性のある多くの場所があります。 サブクラス化ThreadPoolExecutorしafterExecute、タスクの実行中に発生したキャッチされない例外を提供することになっているメソッドをオーバーライドしました。しかし、私はそれを機能させることができないようです。 例えば: public class ThreadPoolErrors extends ThreadPoolExecutor { public ThreadPoolErrors() { super( 1, // core threads 1, // max threads 1, // timeout TimeUnit.MINUTES, // timeout units new LinkedBlockingQueue<Runnable>() // work queue ); } protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if(t != null) { System.out.println("Got an …

14
ExecutorService、すべてのタスクが完了するまで待機する方法
すべてのタスクがExecutorService完了するのを待つ最も簡単な方法は何ですか?私のタスクは主に計算なので、コアごとに1つずつ、多数のジョブを実行したいだけです。現在、私のセットアップは次のようになります。 ExecutorService es = Executors.newFixedThreadPool(2); for (DataTable singleTable : uniquePhrases) { es.execute(new ComputeDTask(singleTable)); } try{ es.wait(); } catch (InterruptedException e){ e.printStackTrace(); } ComputeDTask実行可能を実装します。これはタスクを正しく実行するように見えますが、コードはでクラッシュwait()しIllegalMonitorStateExceptionます。これは奇妙です。私がおもちゃの例をいじってみたところ、動作するように見えました。 uniquePhrases数万の要素が含まれています。別の方法を使用する必要がありますか?できるだけシンプルなものを探しています

7
ExecutorServiceの送信とExecutorServiceの実行のどちらかを選択します
戻り値が気にならない場合、ExecutorServiceの submitまたはexecute のどちらを選択すればよいですか? 両方をテストした場合、戻り値以外は2つの間に違いはありませんでした。 ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.execute(new Task()); ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.submit(new Task());


6
スレッドプールからスレッドIDを取得する方法
タスクを送信する固定スレッドプールがあります(5スレッドに制限されています)。これらの5つのスレッドの1つが私のタスクを実行していることをどのように確認できますか(「5番目のスレッド#3がこのタスクを実行している」など)。 ExecutorService taskExecutor = Executors.newFixedThreadPool(5); //in infinite loop: taskExecutor.execute(new MyTask()); .... private class MyTask implements Runnable { public void run() { logger.debug("Thread # XXX is doing this task");//how to get thread id? } }

13
サイズ制限付きのキャッシュスレッドプールを作成することはできませんか?
作成できるスレッドの数に制限を設けて、キャッシュされたスレッドプールを作成することは不可能のようです。 静的なExecutors.newCachedThreadPoolが標準Javaライブラリにどのように実装されているかを次に示します。 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } したがって、そのテンプレートを使用して、固定サイズのキャッシュされたスレッドプールを作成します。 new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); これを使用して3つのタスクを送信すると、すべてが正常になります。さらにタスクを送信すると、拒否された実行例外が発生します。 これを試す: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); すべてのスレッドが順次実行されます。つまり、スレッドプールがタスクを処理するために複数のスレッドを作成することはありません。 これはThreadPoolExecutorの実行メソッドのバグですか?または、これは意図的なものですか?または他の方法がありますか? 編集:私はキャッシュされたスレッドプールとまったく同じものを求めます(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続けることができますスレッドの制限に達しました。sjleeの回答によると、これは不可能です。ThreadPoolExecutorのexecute()メソッドを見ると、実際には不可能です。SwingWorkerと同じようにThreadPoolExecutorをサブクラス化してexecute()をオーバーライドする必要がありますが、SwingWorkerがそのexecute()で行うことは完全なハックです。

3
FixedThreadPoolとCachedThreadPool:2つの悪の小さい方
たくさんのタスクを実行するスレッド(約5〜150)を生成するプログラムがあります。もともと、私が使用しFixedThreadPoolているため、この類似した質問は、彼らがより良い、より長い寿命のタスクに適した提案とマルチスレッドの私の非常に限られた知識で、私は、スレッド(数分)の平均寿命は「とみなさ長く住んでいました」。 ただし、最近、追加のスレッドを生成する機能を追加しました。これにより、設定したスレッド制限を超えてしまいます。この場合、許可できるスレッドの数を推測して増やすか、スレッドをCachedThreadPool無駄にしないように切り替える方が良いでしょうか? 両方試してみて、違いはないようですのでCachedThreadPool、ムダを避けるためだけに行きたいと思います。ただし、スレッドの寿命は、代わりにを選択FixedThreadPoolして未使用のスレッドを処理する必要があることを意味しますか?この質問では、これらの余分なスレッドが無駄になっていないように見えますが、明確にしていただければ幸いです。

9
タイムアウト後にタスクを中断するExecutorService
タイムアウトを指定できるExecutorService実装を探しています。ExecutorServiceに送信されたタスクは、実行にタイムアウトよりも長い時間がかかると中断されます。そのような獣を実装することはそれほど難しい作業ではありませんが、誰かが既存の実装を知っているかどうか疑問に思っています。 以下は、以下の議論に基づいて私が思いついたものです。コメントは? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) …

7
Java:特定のキューサイズの後に送信をブロックするExecutorService
単一のスレッドが並行して実行できるI / O集約型タスクを生成するソリューションをコーディングしようとしています。各タスクには、重要なメモリ内データがあります。そのため、現在保留中のタスクの数を制限できるようにしたいと思います。 このようにThreadPoolExecutorを作成すると、次のようになります。 ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(maxQueue)); 次に、キューがいっぱいになり、すべてのスレッドがすでにビジー状態になるとexecutor.submit(callable)スローさRejectedExecutionExceptionれます。 executor.submit(callable)キューがいっぱいですべてのスレッドがビジーのときにブロックを作成するにはどうすればよいですか? 編集:私はこれを試しました: executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); そして、それは私が達成したい効果をいくらか達成しますが、エレガントではありません(基本的に拒否されたスレッドは呼び出しスレッドで実行されるため、呼び出しスレッドがそれ以上送信するのをブロックします)。 編集:(質問をしてから5年後) この質問とその回答を読んでいる人には、受け入れられた回答を1つの正しい解決策と見なさないでください。すべての回答とコメントをお読みください。

5
ExecutorServiceでshutdown()を呼び出す理由
私は過去数時間でそれについてかなり読んでいた、と私は単に何らかの理由(見ることができない正当なコールする理由)shutdown()上をExecutorService我々が使用されていない別のエグゼキュータのサービスのでかいアプリケーションストア、何十と数十を持っていない限り、長い間。 (私が収集したものから)シャットダウンが行う唯一のことは、それが行われた後、通常のスレッドが行うことを行うことです。通常のスレッドがRunnable(またはCallable)のrunメソッドを終了すると、ガベージコレクションに渡されて収集されます。エグゼキュータサービスを使用すると、スレッドは単に保留になり、ガベージコレクション用にチェックされません。そのためにはシャットダウンが必要です。 質問に戻りましょう。ExecutorService非常に頻繁に、またはいくつかのタスクを送信した直後にシャットダウンを呼び出す理由はありますか?誰かがそれをしているケースを残し、その直後にawaitTermination()これが検証されたときに電話をかけたいと思います。それを行っExecutorServiceたら、同じことをするために、新しいものをもう一度作り直す必要があります。ExecutorServiceスレッドを再利用するための全体的なアイデアではありませんか?では、なぜExecutorServiceそんなに早く破壊するのですか? 単純に作成するExecutorService(または必要な数に応じて結合する)のは合理的な方法ではありません。アプリケーションの実行中に、タスクが発生したらタスクを渡し、アプリケーションの終了またはその他の重要な段階でそれらのエグゼキュータをシャットダウンします。 ? ExecutorServicesを使用して多くの非同期コードを作成する経験豊富なコーダーからの回答をお願いします。 2番目の質問、Androidプラットフォームを扱う少し小さい。毎回エグゼキュータをシャットダウンするのは最善ではないと言う人がいて、Androidでプログラムしている場合、さまざまなイベントを処理するときに、これらのシャットダウンをどのように処理するか(具体的には、実行するとき)を教えてください。アプリケーションのライフサイクル。 CommonsWareのコメントのため、私は投稿を中立にしました。私はそれについて議論することに本当に興味がなく、それがそこにつながっているようです。経験豊富な開発者が経験を共有してくれるのであれば、ここで私がここで尋ねたことについて学ぶことにのみ興味があります。ありがとう。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.