問題タブ [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 - Executors の何がそんなに優れているのですか?
Java Executor のない生活では、Runnable タスクごとに新しいスレッドを作成する必要があります。新しいスレッドを作成するには、スレッドのオーバーヘッド (作成と破棄) が必要であり、Executor 以外のプログラムに複雑さと無駄な時間を追加します。
コードを参照する:
Java Executor なし -
Java Executor を使用 -
要するに、Executor はスレッドの管理方法の低レベルの詳細を抽象化するということです。
本当?
ありがとう。
java - ThreadPoolExecutorとカスタムタスクを使用してPriorityBlockingQueueを実装する方法
私はたくさん検索しましたが、私の問題の解決策を見つけることができませんでした。
BaseTask
を使用しThreadPoolExecutor
てタスクを処理する独自のクラスがあります。タスクの優先順位付けが必要ですが、タスクをオブジェクトにラップするため、 PriorityBlockingQueue
Iを使用しようとすると取得します。ClassCastException
ThreadPoolExecutor
FutureTask
FutureTask
は実装されていないため、これは明らかに理にかなっていComparable
ますが、優先度の問題を解決するにはどうすればよいでしょうか。newTaskFor()
でオーバーライドできることを読みましたがThreadPoolExecutor
、このメソッドがまったく見つからないようです...?
任意の提案をいただければ幸いです!
役立つコード:
私のBaseTask
クラスでは
BaseFutureTask
クラスで
BaseThreadPoolExecutor
クラスiで3つのメソッドをオーバーライドします...このsubmit
クラスのコンストラクターが呼び出されますが、どのsubmit
メソッドも呼び出されません
android - Looperを複数回呼び出すと、「デッドスレッドのハンドラーにメッセージが送信されます」
ルーパーを追加する独自のThreadFactoryでExecutor[固定スレッドプール]を使用しています。
ネットワーク要求を行うスレッドを実行していますが、ネットワークに障害が発生した場合、ダイアログメッセージをユーザーに表示したいと思います。このプロセスは、UIスレッドでリクエストを作成して表示する必要があるため、かなり複雑です。ネットワークスレッドにループを追加し、UIスレッドからメッセージが送信されるのを待つだけで、ダイアログに対するユーザーの応答を待つことができます。これにより、ネットワーク要求をwhile(tryAgain)スレッドにカプセル化できます。Looper.loop()メソッドが2回目に呼び出され(2番目のネットワークエラーダイアログが表示された後)、ダイアログによって(UIスレッドで)メッセージがネットワークスレッドのハンドラーに送信される場合を除いて、すべてが正常に機能します。
AlertDialogインスタンスには、OnClickListenerがあります。
スレッドがまだアクティブでhandler.getLooper().getThread().isAlive()
あり、常にtrueを返すことを確認しましたが、それでも「デッドスレッドのハンドラーにメッセージを送信する」ことができます。メッセージ/ハンドラーがスレッドが停止しているとどのように判断したのですか?.isAlive()メソッドに依存するべきではありませんか?結局、私はスレッド管理ビルドをAndroidOSに複製することを避けようとしています:-)
java - ThreadPoolExecutor.CallerRunsPolicyがRejectedExecutionExceptionをスローすることはありますか?
ThreadPoolExecutor.CallerRunsPolicyがRejectedExecutionExceptionをスローする状況はありますか?
ポリシー自体は、これらの例外のスローを防ぐことを目的としているように思われます。インターフェイスメソッドのAPIであるRejectedExecutionHandler.rejectedExecution()は、をスローする可能性があると主張していRejectedExecutionException
ます。CallerRunsPolicy.rejectedExecution()のAPIはそうではありません。
概要: ?を使用している場合、RejectedExecutionException
を明示的に処理する必要がありますか?execute()
CallerRunsPolicy
android - Androidでタスクをキューに入れるために、AsyncTaskまたはIntentServiceの代わりにExecutorを使用するにはどうすればよいですか?
それは良い解決策ですか?
実装方法は?
いつ適切にシャットダウンする必要がありますか? アクティビティで onDestroy() をシャットダウンし、できるだけ早くアプリを再起動します。なぜ
java.util.concurrent.RejectedExecutionException
ですか?そのライフサイクルを知っている人はいますか?
何か案が?ありがとう。
java - JavaExecutorを使用したマルチスレッド
私はこの次の問題で立ち往生しています。たとえば、1000個のアイテムがあるリクエストがあり、これを解決するためにJavaExecutorを利用したいとします。
これが主な方法です
そしてこれがQueryTaskクラスです
したがって、上記の例に基づいて、リクエストに含まれるデータごとにスレッドプールを作成し、それを同時に実行して、結果をVectorListに追加します。そして、プロセスの最後に、すべての結果をベクターリストに入れておきたいと思います。
応答に一貫性のない結果が出続けます。たとえば、10個の名前でリクエストを渡すと、3個または4個しか返されません。場合によっては、応答に何も返されません。私は10を通過すると、10を取り戻すことを期待していました。
誰かが問題の原因を知っていますか?
どんな助けでもそれを高く評価するでしょう。
ありがとう
java - 私が持っているエグゼキュータの数を制限する必要がありますか?
物事を並行して実行する必要があるJavaプロジェクトがあります。私はエグゼキュータでこれを行います。問題は、非常に多くの場所でエグゼキュータを使用する必要があるということです。作業を行うために数人のエグゼキュータを渡すことを好むべきですか(一時的にグローバルスレッド数を制限することを忘れてください)、または必要な場所にエグゼキュータを作成することが望ましいですか?
java - 「Single LIFO Executor」 / SwingWorker
JList または JTable を使用する Swing アプリケーションを考えてみましょう。選択が変更されると、SwingWorker が開始され、データベースから関連データがロードされ、UI が更新されます。これは正常に機能し、UI はレスポンシブです。
しかし、ユーザーが選択した行をすばやく変更している場合 (キーアップ/ダウンを押したまま)、最後に選択した行が最後にロードされた行であることを確認したいと思います。また、無駄に DB にクエリを実行したくありません。したがって、サイズが 1 の LIFO キューを持つシングル スレッドのエグゼキュータが必要です。そのため、タスクをサブミットすると、以前にサブミットされたタスクが削除され、一度に最大 1 つのタスクが実行され、最大 1 つのタスクが実行待ちになります。
java.util.concurrent でこのようなものを見つけることができなかったので、独自の Executor を作成しました。私はそれを正しかったのですか、それとも並行パッケージから何かが欠けていますか? 解決策は受け入れられますか、それとも私が望むものを達成するためのより良い方法はありますか?
そして、これがどのように使用できるかを示す例です:
java - クアッドコア マシンで複数のスレッドを使用しているときに、このコードのパフォーマンスが大幅に向上しないのはなぜですか?
Executor フレームワークについて詳しく知るために、いくつかの Java コードを作成しました。
具体的には、コラッツ仮説を検証するコードを書きました。これは、次の関数を任意の整数に繰り返し適用すると、最終的に 1 になることを示しています。
f(n) = ((n % 2) == 0) ? n/2 : 3*n + 1
CH はまだ証明されていませんが、Executor について学ぶには良い方法だと思いました。各スレッドには、チェックする整数の範囲 [l,u] が割り当てられます。
具体的には、私のプログラムは 3 つの引数を取ります - N (CH をチェックしたい数)、RANGESIZE (スレッドが処理しなければならない間隔の長さ)、および NTHREAD、スレッドプールのサイズです。
私のコードは正常に動作しますが、1 スレッドから 4 スレッドに変更したときは 30% 程度の速度向上が期待したほどではありませんでした。
私の論理では、計算は完全に CPU バウンドであり、各サブタスク (CH の固定サイズ範囲のチェック) にはほぼ同じ時間がかかります。
3 倍から 4 倍の速度の向上が見られない理由について、誰か考えがありますか?
スレッドの数を (マシン、JVM、OS とともに) 増やしてランタイムを報告できれば、それも素晴らしいことです。
仕様
ランタイム:
java -d64 -server -cp . Collatz 10000000 1000000 4 => 4 スレッド、28412 ミリ秒かかります
java -d64 -server -cp . Collatz 10000000 1000000 1 => 1 スレッド、38286 ミリ秒かかります
プロセッサー:
2.4GHZ、4GB のクアッドコア Intel Q6600。マシンがアンロードされます。
ジャワ:
Java バージョン "1.6.0_15" Java(TM) SE ランタイム環境 (ビルド 1.6.0_15-b03) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 14.1-b02、混合モード)
OS:
Linux quad0 2.6.26-2-amd64 #1 SMP Tue Mar 9 22:29:32 UTC 2010 x86_64 GNU/Linux
コード: (投稿するコードを取得できません。SO 要件には長すぎると思います。ソースはGoogle ドキュメントで入手できます。
java - ThreadPoolはタスクを順番に実行しません
私はExecutor
特にフレームワークを使用しています。たとえば100のExecutors.newCachedThreadPool();
リストがあります。
最初の50は、それぞれが最後の50で使用される値(リストに格納されている)を作成
します。それらはリストにあり、同じ順序で実行されます。
しかし、これは起こっていません。
タスクはランダムな順序で実行されているように見え、順番に実行されるのではなく、インターリーブされます。
これはどのように機能するのでしょうか?この問題を回避する方法はありますか?Runnable
Runnable
executor.execute()
ありがとう