問題タブ [futuretask]
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.util.concurrent.FutureTask を使用するのは良い方法ですか?
まず第一に、私は API java.util.concurrent にまったく慣れていないので、おそらく私がやっていることは完全に間違っていると言わなければなりません。
私は何をしたいですか?
基本的に 2 つの別個の処理 ( myFirstProcess、mySecondProcessと呼ばれる) を実行する Java アプリケーションがありますが、これらの処理は同時に実行する必要があります。
だから、私はそれをやろうとしました:
myFirstProcessとmySecondProcessは を実装するクラスでCallable<Object>
あり、すべての処理は call() メソッドで行われます。
それは非常にうまく機能していますが、それが正しい方法であるかどうかはわかりません。私がやりたいことをする良い方法はありますか?そうでない場合は、コードを強化するためのヒントを教えてください (できるだけシンプルに保ちます)。
java - Spring TaskExecutors で Future/Futuretask オブジェクトを使用できますか?
Spring TaskExecutor でJava FutureTaskを使用してFutureオブジェクトを取得することは可能ですか?
Java ExecutorServiceインターフェイス、特に submit() メソッドを実装する TaskExecutor を探しています。Spring Javadocsを調べても、このようなクラスは見つかりません。私が気付いていない Spring TaskExecutors を介して先物を処理する別の方法はありますか?
可能であれば、例も含めていただけますか?
java - JavaのScheduledExecutorServiceとFutureTaskの明確さを求めています
私はJavaでFuturesとScheduledExecutorServiceを調べ始めたところですが、なぜCallableが指定したスケジュールで実行されないのか疑問に思っています。このサンプルコードでは、呼び出し可能オブジェクトは1回実行されますが、アプリが完了したり、タスクが再度実行されたりすることはありません。これは、私が予想していたことです(問題は私の予想にあると確信しています)。
Runnablesは正常に機能します。Callablesは永久にブロックされているように見えますが、理由はわかりません。
ありがとう!
java - Java 5:java.util.concurrent.FutureTask-cancel()およびdone()のセマンティクス
私は現在、FutureTasksとExecutorsを使用して、マルチスレッド環境で厄介なバグを探しています。基本的な考え方は、固定数のスレッドに、テーブルに表示される結果を計算する個々のFutureTasksを実行させることです(ここではGUIの側面を気にしないでください)。
私はこれを長い間見てきました、私は自分の正気を疑うようになり始めています。
このコードを考えてみましょう。
MyTaskdone()
のインスタンスを処理するエグゼキュータによって呼び出された場合、タスクがキャンセルされたため、そこに到達したかどうかを確認します。もしそうなら、私は残りのすべての活動をスキップします、特に私は電話しませんsendMessage()
。
FutureTask.done()のドキュメントには次のように書かれています。
このタスクが状態isDoneに遷移するときに呼び出される保護されたメソッド(通常またはキャンセルを介して)。デフォルトの実装は何もしません。サブクラスは、このメソッドをオーバーライドして、完了コールバックを呼び出したり、簿記を実行したりできます。このメソッドの実装内でステータスを照会して、このタスクがキャンセルされたかどうかを判断できることに注意してください。(APIリファレンス)
しかし、のドキュメントから得られないのは、実行中FutureTask
のセマンティクスです。最初にチェックに合格したが、その直後に他のスレッドが私のメソッドを呼び出した場合はどうなりますか?それは私の仕事の考えを変え、それ以降に返信する原因になりますか? done()
isCancelled()
cancel()
isCancelled() == true
もしそうなら、メッセージが送信されたかどうかを後でどうやって知ることができますか?見てみるisDone()
と、タスクの実行が終了したisCancelled()
ことがわかりますが、そのときもそうであったように、メッセージを時間内に送信できるかどうかはわかりませんでした。
たぶんこれは明らかですが、私は今それを実際には見ていません。
java - TimeoutExceptionの後にFutureTaskを返すにはどうすればよいですか?
以下のコードでは、意図したとおり、100秒後にTimeoutExceptionが発生しています。この時点で、コードがmainから終了し、プログラムが終了することを期待しますが、コンソールへの出力は続行されます。タイムアウト後にタスクの実行を停止するにはどうすればよいですか?
java - FutureTasks と CachedThreadPool はどのように機能しますか
現在、次のことを行うコードがあります。
私が抱えている問題は、将来のタスクのそれぞれが計算を行うときにかかる時間を出力することです。たとえば、コンソールに表示されます
ただし、合計時間 ( System.out.println(time taken)
) は、将来のタスクにかかる最長時間よりもはるかに長いため、この例に沿って、メソッド do は約 1 分かかります (first_task の 20 秒と比較して)。
これらの将来のタスクは並行して実行されているという印象を受けましたが、タイミングからすると、次から次へと実行されているように見えます。この API を正しく使用していますか?
java - ScheduledExecutorService.scheduleAtFixedRate と過去の日付への initialDelay の設定
startDate、endDate、および発生(毎時、毎日、毎週、毎月、月曜日など) に基づいてリマインダーを送信する Java のスケジューリング システムに取り組んでいます。もともと、リマインダーをスケジュールするためにTimerおよびTimerTaskクラスを使用していました。
最近、 ScheduledExecutorServiceに切り替えたので、イベントのキャンセルをより細かく制御できるようになりました。ScheduledExecutorServiceは、過去の startDate でリマインダーを再スケジュールする 1 つのケースを除いて、定期的なリマインダーに対してうまく機能しています。scheduleAtFixedRate関数では、実際のDateオブジェクトではなく、 initialDelayにlong値のみを指定できます。
負のinitialDelayを渡すと、イベントがすぐに発生し、 startDate + periodではなくnow + periodで再発するため、これは問題を引き起こします。
過去のstartDateでリマインダーを (再) スケジュールする方法はありますか?
java - ThreadPoolExecutorとカスタムタスクを使用してPriorityBlockingQueueを実装する方法
私はたくさん検索しましたが、私の問題の解決策を見つけることができませんでした。
BaseTask
を使用しThreadPoolExecutor
てタスクを処理する独自のクラスがあります。タスクの優先順位付けが必要ですが、タスクをオブジェクトにラップするため、 PriorityBlockingQueue
Iを使用しようとすると取得します。ClassCastException
ThreadPoolExecutor
FutureTask
FutureTask
は実装されていないため、これは明らかに理にかなっていComparable
ますが、優先度の問題を解決するにはどうすればよいでしょうか。newTaskFor()
でオーバーライドできることを読みましたがThreadPoolExecutor
、このメソッドがまったく見つからないようです...?
任意の提案をいただければ幸いです!
役立つコード:
私のBaseTask
クラスでは
BaseFutureTask
クラスで
BaseThreadPoolExecutor
クラスiで3つのメソッドをオーバーライドします...このsubmit
クラスのコンストラクターが呼び出されますが、どのsubmit
メソッドも呼び出されません
java - FutureTaskで例外をキャッチする方法
Java 1.6(およびEclipseから)でFutureTask
実行するとメソッドの例外が飲み込まれることがわかった後、すべての実装にthrow/catchを追加せずにこれらをキャッチする方法を考え出そうとしました。Executors.newCachedThreadPool()
Runnable.run()
Runnable
FutureTask.setException()
APIは、オーバーライドがこれに役立つはずであることを示唆しています。
このFutureがすでに設定されているかキャンセルされていない限り、このFutureは、指定されたthrowableを原因としてExecutionExceptionを報告します。このメソッドは、計算が失敗したときにrunメソッドによって内部的に呼び出されます。
ただし、このメソッドは呼び出されていないようです(デバッガーで実行すると、例外がによってキャッチされますが、FutureTask
呼び出さsetException
れません)。問題を再現するために、次のプログラムを作成しました。
私の主な質問は、FutureTaskでスローされた例外をキャッチするにはどうすればよいですか?なぜsetException
呼ばれないのですか?
Thread.UncaughtExceptionHandler
また、なぜこのメカニズムが使用されていないのか知りたいのFutureTask
ですが、理由はありますか?
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()
複数の呼び出しを実行しようとすると失敗するのはなぜですか?