問題タブ [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.

0 投票する
1 に答える
951 参照

android - Android は、ScheduledExecutorService を使用して Thread の定期的な実行を「逃す」

私は、周囲のwifiネットワークから指紋を繰り返し収集するAndroidアプリを持っています(科学的な理由から、誰のプライバシーも侵害しないためです)。

とにかく、この作業を行う関数があり、それがscanWifi()と呼ばれていると想像してください。私は当初、次のように開始したかったのです。

悲しいことに、これは電話が差し込まれている場合にのみ確実に機能します。差し込まれてしばらくそこに置かれていると、毎分 scanWifi() 関数が実行されません。scanWifi() への 1 回の呼び出しの間に数分のギャップが生じることがあります。

また、Timer/TimerTask を使用して同じことを試みましたが、同様の結果が得られませんでした。

これまで多かれ少なかれ確実に動作しているように見える唯一のことは、次のようにハンドラーに投稿して繰り返し呼び出すことです。

なぜそうなのですか?CPU がスリープしているため、スケジュールされた実行に失敗していますか? アプリで部分的なウェイクロックを保持しています。

0 投票する
1 に答える
174 参照

java - ExecutorServiceによって生成された結果を消費します。どのクラス?

クラス/インターフェース名を書き留めておけばよかったのですが、書き留めていませんでした...

JDK javadocsを調べたときに、ExecutorService(完了したFutures<T>s)によって生成された結果を収集して消費することを目的とした、おそらくシステムの他の場所でのクラス/インターフェースへの参照を見つけました。当時は必要なものにぴったりだったので心に留めていましたが、クラスの名前がわからなくなってしまいました。

誰かが私が何を指しているのか考えていますか?

0 投票する
3 に答える
3261 参照

java - エグゼキュータによるJavaスレッドの再利用

私は次の点で混乱しています:
Java プログラムでスレッドを使用するための最も簡単な方法は、Thread クラスを拡張し、実行可能なインターフェースを実装する (または単に実行可能なものを実装する) ことです。
スレッドの実行を開始します。スレッドのメソッド start() を呼び出す必要があります。これにより、スレッドのメソッド run() が呼び出されます。そして、スレッドが開始されます。
メソッド start() (私が間違っていない限り)は、スレッドごとに1 回だけ正確に呼び出す必要があります。その結果、スレッドの再利用のカスタム実装を容易にする無限ループの短い部分で run メソッド自体が何らかの方法で実行されない限り、スレッド インスタンスを再利用することはできません。
現在、javadoc リンクテキスト

実行する呼び出しは、利用可能な場合、以前に構築されたスレッドを再利用します

これがどのように実装されているかわかりません。executor メソッドの execute メソッドで、カスタム スレッドを提供します。

エグゼキュータ フレームワークに委任したこのカスタム スレッドを再利用するにはどうすればよいですか?
Executor はメソッド start() を複数回呼び出すことができますが、プログラムではできませんか? 私は何か誤解していますか?

ありがとうございました。

0 投票する
3 に答える
667 参照

java - Java のスレッド化に関するいくつかの質問

最初に少し背景を。NetBeans で、コンストラクターで新しいスレッドを開始しないようにという警告が表示されました。その理由は、コンストラクターが実際にオブジェクトの作成を完了する前に、新しいスレッドが開始され、スレッドを開始したオブジェクトを参照しようとする可能性があるためだと読みました。

1.) 使用する代わりに実験のためnew Threadthread.start()試しExecutorServiceてみましたが、警告は表示されませんでした。 これは、コンストラクターで新しいスレッドを作成して開始しても問題ないということExecutorServiceですか?

2.) また、ExecutorServiceキャッシュされたスレッド プールの形式がある場合は、標準的な方法で新しいスレッドを作成し、キャッシュ プールからスレッドnew Threadthread.start()プルします (または、スレッドが利用できない場合はスレッドを作成させます)。それとも、これらのスレッドはキャッシュされたスレッド プールから完全に独立していますか?

0 投票する
7 に答える
102451 参照

java - ExecutorService の送信と ExecutorService の実行のどちらかを選択します

ExecutorService の submitまたはexecuteをどのように選択すればよいですか? 返される値が気にならない場合は?

両方をテストした場合、戻り値を除いて、2 つの間に違いは見られませんでした。


0 投票する
9 に答える
53113 参照

java - ExecutorService を使用する利点は何ですか?

コンストラクタに aをExecutorService渡すオーバーラン スレッドを使用する利点は何ですか?RunnableThread

0 投票する
1 に答える
678 参照

java - 面白いことが起こります...ExecutorCompletionService

ネットワーク上の到達可能なすべてのホストを見つける必要があるJavaで記述されたアプリケーションがあります。

InetAddress.isReachable()はこれを2000ミリ秒のタイムアウトで行うために使用します。

現在のローカルマシンのIPアドレスを検索し、それに基づいて、ローカルマシンのIPアドレスが欠落している1〜255で終わる他のIPアドレスに到達しようとします。

それはすべて正常にシングルスレッドで動作しますが、ほとんどのIPアドレスは存在しないため到達できないため、2秒のタイムアウトを使い切るので時間がかかります。

物事をスピードアップするために(そして実際に並行性を試すために:: Brian Goetz)私はFutureandCallableなどを使ってみました。

これもすべてうまくいきました。

ただしExecutorCompletionService、ユーザーがより応答性の高いアプリケーションを使用できるようにするためにを使用することを考えたので、ユーザーはを使用して利用可能になったときに結果を確認できました。

次の構成を使用してシングルプロセッサマシンでこれを実行すると、到達可能な4つのホストのうち1つだけが識別されます。

クアッドコアマシンでこれに変更すると、到達可能なすべてのホストを検出できなくなります。

タイムアウトを10秒に変更することInetAddress.isReachable()で、最後の構成が正常に機能するようになりました。

また、クアッドコアマシンで次のように構成を変更することにより、2秒のタイムアウトで動作するようになりました。

なぜこれが起こるのか非常に明白な何かが欠けていますか?

InetAddress.isReachable(2000)ネットワーク上の到達可能なすべてのホストを検出できないのは何ですか?

InetAddress.isReachable()複数の呼び出しを実行しようとすると失敗するのはなぜですか?

0 投票する
2 に答える
4324 参照

java - executorservice による順次イベント処理

処理するイベント キューがあります。スレッドはイベントをキューに追加します。メソッドでイベントを処理するために必要なすべてを
実行する実行可能なタスクを作成しました。私は各タスク を 宣言しました。run
Executors.newCachedThreadPool();execute

私の問題はexecute、エグゼキュータを呼び出すと、コードが次のイベントを取得し、エグゼキュータを介して次の実行可能ファイルを実行することです。私の目的は、前のタスクが終了した後にのみキューから次のイベントを処理することです。
handleNextEvent を再度呼び出すことができるように、前のタスクが終了したかどうかをどのように確認できますか?
タスクによっていくつかのステータス フィールドを更新するのは良い考えですか?

ありがとう

0 投票する
2 に答える
576 参照

java - 私が持っているエグゼキュータの数を制限する必要がありますか?

物事を並行して実行する必要があるJavaプロジェクトがあります。私はエグゼキュータでこれを行います。問題は、非常に多くの場所でエグゼキュータを使用する必要があるということです。作業を行うために数人のエグゼキュータを渡すことを好むべきですか(一時的にグローバルスレッド数を制限することを忘れてください)、または必要な場所にエグゼキュータを作成することが望ましいですか?

0 投票する
2 に答える
1370 参照

java - ScheduledExecutorService ワーカー スレッドは、FutureTask.cancel(true) の後も中断状態を保持します。

ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...)を介して定期的に実行するようにスケジュールするタスクがあります。ユーザーはこのタスクを手動でキャンセルできます。これにより、 ScheduledFuture.cancel(true)が呼び出されます。何らかの理由で、おそらくこのタスクをいつキャンセルするかによって、タスクの run() メソッドが終了した後、ワーカー スレッド (executor がタスクを実行するために使用したスレッド) が中断された状態のままになっているように見えます。

ただし、既存のフックを使用して新しいタスクを開始する前に、(プールから取得して再利用した) ワーカー スレッドの中断状態をクリアする必要があります ( ThreadPoolExecutor.beforeExecute()またはThreadPoolExecutor.afterExecute( ) を介して)。ただし、デフォルトの実装ではこれを行いません。

2 つの質問があります。

  • 割り込みステータスが設定された状態でワーカー スレッドが放置されるのはどうしてですか?
  • 新しいタスクを開始する前に、デフォルトの実装が割り込みステータスをクリアしないのはなぜですか?