問題タブ [executorservice]
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.
android - Android は、ScheduledExecutorService を使用して Thread の定期的な実行を「逃す」
私は、周囲のwifiネットワークから指紋を繰り返し収集するAndroidアプリを持っています(科学的な理由から、誰のプライバシーも侵害しないためです)。
とにかく、この作業を行う関数があり、それがscanWifi()と呼ばれていると想像してください。私は当初、次のように開始したかったのです。
悲しいことに、これは電話が差し込まれている場合にのみ確実に機能します。差し込まれてしばらくそこに置かれていると、毎分 scanWifi() 関数が実行されません。scanWifi() への 1 回の呼び出しの間に数分のギャップが生じることがあります。
また、Timer/TimerTask を使用して同じことを試みましたが、同様の結果が得られませんでした。
これまで多かれ少なかれ確実に動作しているように見える唯一のことは、次のようにハンドラーに投稿して繰り返し呼び出すことです。
なぜそうなのですか?CPU がスリープしているため、スケジュールされた実行に失敗していますか? アプリで部分的なウェイクロックを保持しています。
java - ExecutorServiceによって生成された結果を消費します。どのクラス?
クラス/インターフェース名を書き留めておけばよかったのですが、書き留めていませんでした...
JDK javadocsを調べたときに、ExecutorService
(完了したFutures<T>
s)によって生成された結果を収集して消費することを目的とした、おそらくシステムの他の場所でのクラス/インターフェースへの参照を見つけました。当時は必要なものにぴったりだったので心に留めていましたが、クラスの名前がわからなくなってしまいました。
誰かが私が何を指しているのか考えていますか?
java - エグゼキュータによるJavaスレッドの再利用
私は次の点で混乱しています:
Java プログラムでスレッドを使用するための最も簡単な方法は、Thread クラスを拡張し、実行可能なインターフェースを実装する (または単に実行可能なものを実装する) ことです。
スレッドの実行を開始します。スレッドのメソッド start() を呼び出す必要があります。これにより、スレッドのメソッド run() が呼び出されます。そして、スレッドが開始されます。
メソッド start() (私が間違っていない限り)は、スレッドごとに1 回だけ正確に呼び出す必要があります。その結果、スレッドの再利用のカスタム実装を容易にする無限ループの短い部分で run メソッド自体が何らかの方法で実行されない限り、スレッド インスタンスを再利用することはできません。
現在、javadoc
リンクテキスト
は
実行する呼び出しは、利用可能な場合、以前に構築されたスレッドを再利用します
これがどのように実装されているかわかりません。executor メソッドの execute メソッドで、カスタム スレッドを提供します。
エグゼキュータ フレームワークに委任したこのカスタム スレッドを再利用するにはどうすればよいですか?
Executor はメソッド start() を複数回呼び出すことができますが、プログラムではできませんか? 私は何か誤解していますか?
ありがとうございました。
java - Java のスレッド化に関するいくつかの質問
最初に少し背景を。NetBeans で、コンストラクターで新しいスレッドを開始しないようにという警告が表示されました。その理由は、コンストラクターが実際にオブジェクトの作成を完了する前に、新しいスレッドが開始され、スレッドを開始したオブジェクトを参照しようとする可能性があるためだと読みました。
1.) 使用する代わりに実験のためnew Thread
にthread.start()
試しExecutorService
てみましたが、警告は表示されませんでした。 これは、コンストラクターで新しいスレッドを作成して開始しても問題ないということExecutorService
ですか?
2.) また、ExecutorService
キャッシュされたスレッド プールの形式がある場合は、標準的な方法で新しいスレッドを作成し、キャッシュ プールからスレッドnew Thread
をthread.start()
プルします (または、スレッドが利用できない場合はスレッドを作成させます)。それとも、これらのスレッドはキャッシュされたスレッド プールから完全に独立していますか?
java - ExecutorService を使用する利点は何ですか?
コンストラクタに aをExecutorService
渡すオーバーラン スレッドを使用する利点は何ですか?Runnable
Thread
java - 面白いことが起こります...ExecutorCompletionService
ネットワーク上の到達可能なすべてのホストを見つける必要があるJavaで記述されたアプリケーションがあります。
私InetAddress.isReachable()
はこれを2000ミリ秒のタイムアウトで行うために使用します。
現在のローカルマシンのIPアドレスを検索し、それに基づいて、ローカルマシンのIPアドレスが欠落している1〜255で終わる他のIPアドレスに到達しようとします。
それはすべて正常にシングルスレッドで動作しますが、ほとんどのIPアドレスは存在しないため到達できないため、2秒のタイムアウトを使い切るので時間がかかります。
物事をスピードアップするために(そして実際に並行性を試すために:: Brian Goetz)私はFuture
andCallable
などを使ってみました。
これもすべてうまくいきました。
ただしExecutorCompletionService
、ユーザーがより応答性の高いアプリケーションを使用できるようにするためにを使用することを考えたので、ユーザーはを使用して利用可能になったときに結果を確認できました。
次の構成を使用してシングルプロセッサマシンでこれを実行すると、到達可能な4つのホストのうち1つだけが識別されます。
クアッドコアマシンでこれに変更すると、到達可能なすべてのホストを検出できなくなります。
タイムアウトを10秒に変更することInetAddress.isReachable()
で、最後の構成が正常に機能するようになりました。
また、クアッドコアマシンで次のように構成を変更することにより、2秒のタイムアウトで動作するようになりました。
なぜこれが起こるのか非常に明白な何かが欠けていますか?
InetAddress.isReachable(2000)
ネットワーク上の到達可能なすべてのホストを検出できないのは何ですか?
InetAddress.isReachable()
複数の呼び出しを実行しようとすると失敗するのはなぜですか?
java - executorservice による順次イベント処理
処理するイベント キューがあります。スレッドはイベントをキューに追加します。メソッドでイベントを処理するために必要なすべてを
実行する実行可能なタスクを作成しました。私は各タスク を
宣言しました。run
Executors.newCachedThreadPool();
execute
私の問題はexecute
、エグゼキュータを呼び出すと、コードが次のイベントを取得し、エグゼキュータを介して次の実行可能ファイルを実行することです。私の目的は、前のタスクが終了した後にのみキューから次のイベントを処理することです。
handleNextEvent を再度呼び出すことができるように、前のタスクが終了したかどうかをどのように確認できますか?
タスクによっていくつかのステータス フィールドを更新するのは良い考えですか?
ありがとう
java - 私が持っているエグゼキュータの数を制限する必要がありますか?
物事を並行して実行する必要があるJavaプロジェクトがあります。私はエグゼキュータでこれを行います。問題は、非常に多くの場所でエグゼキュータを使用する必要があるということです。作業を行うために数人のエグゼキュータを渡すことを好むべきですか(一時的にグローバルスレッド数を制限することを忘れてください)、または必要な場所にエグゼキュータを作成することが望ましいですか?
java - ScheduledExecutorService ワーカー スレッドは、FutureTask.cancel(true) の後も中断状態を保持します。
ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...)を介して定期的に実行するようにスケジュールするタスクがあります。ユーザーはこのタスクを手動でキャンセルできます。これにより、 ScheduledFuture.cancel(true)が呼び出されます。何らかの理由で、おそらくこのタスクをいつキャンセルするかによって、タスクの run() メソッドが終了した後、ワーカー スレッド (executor がタスクを実行するために使用したスレッド) が中断された状態のままになっているように見えます。
ただし、既存のフックを使用して新しいタスクを開始する前に、(プールから取得して再利用した) ワーカー スレッドの中断状態をクリアする必要があります ( ThreadPoolExecutor.beforeExecute()またはThreadPoolExecutor.afterExecute( ) を介して)。ただし、デフォルトの実装ではこれを行いません。
2 つの質問があります。
- 割り込みステータスが設定された状態でワーカー スレッドが放置されるのはどうしてですか?
- 新しいタスクを開始する前に、デフォルトの実装が割り込みステータスをクリアしないのはなぜですか?