問題タブ [threadpoolexecutor]
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 - キューに入れる代わりに新しいスレッドを開始する
のjavadocからThreadPoolExecutor
:
メソッド execute(java.lang.Runnable) で新しいタスクが送信されると .... 実行中のスレッドが corePoolSize より多く、 maximumPoolSize より少ない場合、キューがいっぱいの場合にのみ新しいスレッドが作成されます。
ThreadPool
この状況でタスクをキューに送信する代わりに、新しいスレッドを開始するにはどうすればよいですか?
例:
corePoolSize=5 と maxPoolSize=10 のスレッドと無制限のキューがあります。
corePoolSizeスレッドが現在ビジーで、新しいタスクが到着したとします。プールは新しいスレッドを開始し、新しいタスクを実行する必要があります。
maxPoolSizeスレッドが現在ビジーで、新しいタスクが到着したとします。プールはタスクをキューに永続化する必要があり、最初に空きスレッドがこのタスクを取得して実行する必要があります。
java - ノンブロッキング方式でファイルアップロードを処理する
背景スレッドはこちら
目的を明確にするために、ユーザーは大きなファイルをアップロードし、さまざまな操作を続行するためにすぐに別のページにリダイレクトする必要があります。ただし、ファイルが大きいため、コントローラーのInputStreamから読み取るのに時間がかかります。そのため、このI/Oを処理するために新しいスレッドをフォークすることにしました。コードは次のとおりです。
コントローラサーブレット
モデルクラス
ランナブル_
私の質問/疑問:
- サーブレットから手動でスレッドを生成することは論理的には理にかなっていますが、コーディングに関しては怖いです-結局、コンテナはこれらのスレッドを認識していません(私はそう思います!)
現在のコードは非常に明白な例外を与えています-run()メソッドが完了する前にdoPost(...)メソッドが戻るため、ストリームにアクセスできません:
/li>ポイント1を念頭に置いて、Executorフレームワークの使用はとにかく私を助けますか?
/li>
では、(アップロードされた)ファイルをストリームから読み取れるように、ユーザーがブロックせず、ストリームにアクセスできるようにするにはどうすればよいですか?
java - Java でタスクの順序実行を指定する
私はたくさん検索しましたが、解決策が見つかりませんでした。私は次のようにJavaスレッドプールを使用します:
このようにして、タスクは結果の順序で (キューのように) 実行されます。しかし、「次のタスクを選択する」戦略を変更する必要があります。したがって、各タスクに割り当てて優先度を指定し(スレッドの優先度ではありません)、これらの優先度に対応するタスクを実行します。そのため、エグゼキュータが別のタスクを終了すると、次のタスクを最大優先度のタスクとして選択します。一般的な問題について説明します。優先順位を考慮しない、より単純なアプローチがあるかもしれません。最初に追加されたタスクではなく、最後に追加されたタスクを次に実行するように選択します。大まかに言うと、FixedThreadPool は FIFO 戦略を使用します。たとえば、LIFO 戦略を使用できますか?
java - サービスを終了せずに ScheduledThreadPoolExecutorService の遅延を変更する
名前が示すように、Executor サービスを使用してデーモンをスケジュールするデーモン フレームワークがあります。
Runnable
実行時に、アプリケーションを終了せずに、クラスの 2 つの実行間の遅延を変更したいと考えています。
出来ますか?はいの場合、どのように?
java - ThreadPoolExecutor のすべてのワーカーをすぐに強制終了する方法
内にいくつかのタスクがありTheadPoolExecutor
ます。インターフェイスに停止ボタンがあり、内部のすべてのスレッドをThreadPoolExecutor
すぐに終了する必要があります。私はそれを行う方法を探しています。(shutDown()
またはなしshutDownNow()
)。
ありがとう
java - Java エグゼキュータ サービス
JAVAで以下のコードを作成するExecutorService
と、誰かがその仕組みを説明できますExecutorService
か?
単一の作業キューがあり、for ループがRunnable
このキューに 500 のタスクを追加すると思います。これExecutorService
で、400 スレッドのスレッド プールで が作成されました。
キュー内の 500 個のタスクのうち、400 個のスレッドがExecutorService
この 400 個のタスクを一度に実行し、残りのスロットは解放されるのでしょうか?
私の理解は正しいですか?
java - ThreadPoolExecutorがメモリリークを起こしていませんか?
ThreadPoolExecutor
タスクを実行するためにを使用し ています。バックエンドは、SynchronousQueue
であるため、エグゼキュータがすでにタスクを実行している場合は、をスローしRejectedExecutionException
ます。簡単なテストケースは次のとおりです。
予想される動作は次のとおりです。ワーカーを実行し、1秒間スリープした後、i(ワーカーがこれまでに実行された頻度を表す)とワーカーが作成されてからのミリ秒数を出力します。だから私は期待しています:
これはしばらくは問題なく動作しますが、ほぼ1時間後には次のようになります。
したがって、あるワーカーの実行から次のワーカーの実行までの時間は、20秒(2919-> 2920)および38秒(2920-> 2921)などになります。すべてが非常に遅くなり、jvmはガベージコレクションに多くの時間を費やします。最後に(数日後)OutOfMemoryErrorが発生しました。
64ビットLinuxマシン上のOracleのJVM1.7.0_07で、これを-Xmx8M(ヒープスペースが増えると効果がかなり後で現れると思います)で実行しています。ポインタをいただければ幸いですが、おそらく私は明らかなことを見逃しているだけです。
java - ThreadPoolExecutor は、カスタム動作でスレッド プールを修正しました
私はこのトピックに不慣れです...私は Executors.newFixedThreadPool( 10 ) で作成された ThreadPoolExecutor を使用しており、プールがいっぱいになった後、 RejectedExecutionException を取得し始めています。プールが解放されたときに新しいタスクを拒否して開始するのではなく、エグゼキューターに新しいタスクを「待機」状態にするように「強制」する方法はありますか?
ありがとう
java - Spring JPA マルチスレッド
私たちは製品を構築しているので、パフォーマンスの観点から助けが必要です。完全な Spring (MVC、JPA、セキュリティなど) を使用しています。
たとえば、特定のフローで 100 個のビジネス ルールを同時に実行できるという要件があります。n
このようなフローとビジネス ルールは多数存在する可能性があります。
これらのルールを実行すると、実際にデータベース内のテーブルからレコードがフェッチされます。これらには、LAZILY INITIALIZED ENTITIES もほとんど含まれません。
マルチスレッドの目的でFutures
/を使用しましたが、問題は LAZY 変数のロードに失敗することです。Callables
Hibernate の読み込み例外が発生します。おそらく、TRANSACTIONAL で別のスレッドに分散されないという問題があります。
他にアプローチする方法があれば教えてください。
java - APIレスポンダとしてのJava ExecutorCompletionService
ServerSocket
着信クエリをリッスンするサーバー アプリケーションがあります。クエリを送信するクライアントは、サーバーへのソケットを開き、クエリを上流に渡し、(おそらく短時間の後に) クエリの送信に使用したのと同じソケットからクエリへの応答を読み取ることを期待しています。
このために、私はを使用しようとしていますExecutorCompletionService
。さまざまなクエリ クラスがさまざまな に渡されますCallable
が、すべてが結果として a を返すことが期待されString
ます。
実際にクライアントに返信しようとする段階に達するまで、これらすべては非常に扱いやすいものです。現在、Future
オブジェクトはすべて typeFuture<String>
ですが、その結果 ( String
) を適切なに結合できませんSocket
。
私の解決策は、すべてのCallable
s を次のような型Callable<StringSocketPair>
にすることです。StringSocketPair
しかし、これはすべて少し奇妙に思えます。コンストラクターに を渡してSocket
、メソッドからの結果Callable
と一緒にそれを返すことができるようにする必要があるからです。をポーリングするさらに別のスレッドにプッシュできるようにするためです。String
call()
String
Socket
ExecutorCompletionService.take()
もう 1 つのオプションは、Runnable
s の代わりにCallable
s を使用し、各Runnable
タスクを独自に応答させることですが、12 種類ほどのクエリ タイプがあるため、それぞれに独自のタスク オブジェクトがあり、いくつかの呼び出しSocket
を追加する必要はありません。すべてのタスク オブジェクトrespondToClient()
のすべてのメソッドの末尾に種類を設定します。run()
かなり一般的なセットアップであると私が考えるものには、より簡単な解決策が必要ですか?