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

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

java - コンテキスト (CDI/サーブレット) を新しい FutureTask スレッドに挿入する

サーブレットで作成された新しいスレッドに、サーブレット/CDI コンテキストが含まれていないことがわかりました。この問題を実験するために、HelloWorld サーブレット (以下を参照) を作成しました。以下の例では、新しいスレッド (FutureTask) で「doIt()」関数を実行していることがわかります。しかし、それは NULL を返しますが、「doIt()」メソッドを直接呼び出すと、BeanManager は NULL ではありません。

私はオンラインで検索しましたが、それが可能であると言うよりも良い参考文献を見つけることができませんでした. 誰かが私を助けたり、新しいスレッドにコンテキストを挿入/渡すための良いポインタを提供してくれたりしたら、それは素晴らしいことです。

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

java - いずれかのサーバーがダウンした場合に TimeoutException が大量に発生するのはなぜですか?

これが私の DataClientFactory クラスです。

これが私の DataClient クラスです。

以下に示すように、上記のファクトリからクライアント インスタンスを取得し、オブジェクトgetDataSyncを渡してメソッドを呼び出しDataKeyます。DataKey オブジェクトにはuserIdと のTimeout値があります。この後、呼び出しが呼び出されるとすぐに、呼び出しが私のDataTaskクラスに行きます。callhandle.get

ここにすべてのロジックを持つ私の DataTask クラスがあります -

に基づいてuserId、 を取得してserialIdからホスト名のリストを取得します。渡されたフラグに応じて呼び出しを行うことを想定しています。次に、リストを繰り返し処理hostnamesし、サーバーを呼び出します。たとえば、リンクされたリストに 4 つのホスト名 (A、B、C、D) がある場合、最初に A を呼び出し、データが返されたら DataResponse を返します。しかし、A がダウンしている場合、他のスレッドが A のホスト名を呼び出せないように、すぐに A をブロック リストに追加する必要があるとします。次に、ホスト名 B に呼び出しを行い、データを取得して応答を返します (または、B もダウンしている場合は同じことを繰り返します)。

10 分ごとに実行されるバックグラウンド スレッドもあり、ファクトリからクライアント インスタンスを取得するとすぐに開始され、別のサービス URL を解析して、呼び出しを行うべきではないブロック ホスト名のリストを取得します。10分ごとに実行されるため、ダウンしているサーバーは10分後にのみリストを取得します。一般に、Aがダウンしている場合、私のサービスはホスト名のブロックリストとしてAを提供し、Aがアップするとすぐに提供します、そのリストも 10 分後に更新されます。

これが私のバックグラウンド スレッド コード DataScheduler です。

そして、ホスト名のブロック リストと partitionMappings の詳細 (有効なホスト名のリストを取得するために使用される) のすべての情報を保持する ClientData クラスを次に示します。

問題文:-

TimeoutExceptionすべてのサーバー (例として A、B、C、D) が起動している場合、上記のコードは正常に動作し、何も起きていませんhandle.getが、1 つのサーバー (A) がダウンしたとします。メインスレッドから呼び出しを行うと、多くの、つまりTimeoutException、膨大な数のクライアントタイムアウトが発生し始めます。

そして、なぜこれが起こっているのかわからないのですか?サーバーがダウンするとすぐにblockListに追加され、そのサーバーを呼び出すスレッドがなくなり、代わりにリスト内の別のサーバーが試行されるため、一般にこれは正しく行われませんか? したがって、プロセスはスムーズで、これらのサーバーが起動するとすぐに、blockList がバックグラウンド スレッドから更新され、呼び出しを開始できるようになります。

上記のコードに、この問題を引き起こす可能性のある問題はありますか? どんな提案でも大いに役立ちます。

一般に、私がやろうとしているのは、マッピング オブジェクトを使用して渡されるユーザー ID に応じてホスト名リストを作成することです。次に、最初のホスト名を呼び出して、応答を返します。ただし、そのホスト名がダウンしている場合は、ブロック リストに追加して、リストの 2 番目のホスト名を呼び出します。

ここに私が見ているスタックトレースがあります -

注: 複数の userId の場合、同じサーバーを持つことができます。つまり、サーバー A は複数の userId に解決できます。

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

java - TimeoutTask を実装する最良の方法

TimeoutTask特定のタイムアウト後に終了する を実装しようとしています。ここに私が持っているものがあります:

入力がないとタイムアウトのメッセージが表示されます。ただし、プロセスは終了しません。以下は、Eclipse のコンソールのスクリーンショットです。強調表示された部分を参照してください。

ここに画像の説明を入力

入力を行うと、プロセスはすぐに終了しました。catch ブロックから呼び出しておりFutureTask#cancel、finally ブロックから呼び出しを行ってサービスをシャットダウンするように要求していますExecutorService#shoutDownNow。最終的に呼び出されたことが印刷されていることがわかります。

  • タイムアウトの場合、実行中のプロセスを停止するにはどうすればよいですか?
  • これを達成するためのより良いアプローチはありますか?

Java 8を使用しています。

参照:

アップデート

Marko Topolnikの回答では、原因は中断されない Java IO にあると述べています。だから私は次のように変更しCallableます:

この場合、同じことが起こりました。

注:Callableは単なるサンプルです。

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

java - Javaキャンセルフューチャー - 終了を待つ方法は?

簡単に言えば、私はFutureオブジェクトのコレクションを持っています。すでに進行中のものもあれば、まだ進行中のものもあります。future.cancel(false)ドキュメントによると、コレクションと呼び出しを繰り返します。これにより、Future現在実行されていないすべての s をキャンセルする必要がありますが、他のすべての s を完了することができます。

Future私の質問は次のとおりです。電話をかけた後、特定の処理が完了したことをどのように知ることができfuture.cancel(false)ますか? その前に実際に呼び出されたため、future.isDone()常に戻り、がまだ実行中であっても常に a をスローします。truecancel()future.get()CancellationExceptionFuture

助言がありますか?

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

java - Futuretask を使用した入力ストリーム リーダーを備えた Java 非同期プロセス ランナー

非同期プロセスを実行して、その入力ストリームを取得しようとしています (存在する場合)。

これは私のコードです:

これはプロセス実行タスクです

プロセスの出力を取得できません。次の 2 つの非常に重要な点に注意してください。

  • タイムアウトを管理する必要があるため、プロセスは非同期でなければなりません
  • プロセスの InputStream はオプションにすることができ、コンテンツを待機しているスレッドをロックしてはなりません。出力のないプロセスが存在する可能性があります。

アップデート

私はこのバージョンを試しています...うまくいくようですが、十分に強いかどうかはわかりません。

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

java - ArrayAdapter 更新データ

サーバーと通信する Futuretask スレッドに応じて、arraylistを動的に設定/削除するアプリケーションを構築しています。

問題は、新しいオブジェクトをarrayadapterに追加し、何らかの方法でnotifyDataSetChangedまたはsetNotifyOnChangeを呼び出すときです

(たとえば、アイテムを追加した後、notifyDataSetChanged を呼び出す postadd 関数を作成しようとしたり、アダプター コンストラクターに setNotifyOnChange を追加しようとしたり、(adapter.setNotifyOnChange(true)) を追加する前に)

この Futuretask では、単にスレッドをフリーズさせ、アプリケーションの誤動作を引き起こします。ArrayAdapter の getView() を呼び出すために指でスライドするとき、notifyonchange がなければ機能しますが、これは望ましくない動作です。

注: 静的変数参照によってアダプターにアクセスしています。

注#2:新しいアダプターを何度も作成することは賢明な選択だとは思いません。

/編集:

私の削除方法は次のようになります。

(そして、最後のファランテシスで最後にぶら下がっています)

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

android - FutureTask を使用して RESTful Web サービスを呼び出す

当分の間、私は AsyncHttpClient を使用して Android デバイスから RESTfull WebService を呼び出しており、正常に動作しています。スレッドが終了したかどうかなどを確認できるようにするため、FutureTask を使用して最適化したいと考えています。私が今使っているコードはこのようなものです

私が知っているのは、 Callable < class >の呼び出し関数内で AsyncHttpClient を作成し、WebService を呼び出すことです。

ここでは、AsyncHttpClient もスレッドで実行されているため、混乱しています。Futureを使用して Web サービスを呼び出すにはどうすればよいですか。

注: - スレッドの初心者。

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

java - Java Executor は、前の呼び出しが終了した後に 1 つの Callable を実行しますか?

カスタム ビジネス要件があります。一連のサービス コールを実行する必要があります。これらの各呼び出しにより、データベースに新しいレコードが作成されます。新しいサービス コールは、前のサービス コールによって DB に作成されたレコードを入力パラメータとして使用するため、前のサービス コールが終了してから次のサービス コールを実行する必要があります。

これらの各サービス コールを Future Tasks でラップし、Executors.newSingleThreadExecutor()これらのタスクをループで実行するために使用することにしました。

それで十分か、そうでない場合はより良い解決策を提案してください??

また、次のタスクを実行する前に配置する必要がありtask.isDone()ますか??