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

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

java - キューに入れる代わりに新しいスレッドを開始する

のjavadocからThreadPoolExecutor

メソッド execute(java.lang.Runnable) で新しいタスクが送信されると .... 実行中のスレッドが corePoolSize より多く、 maximumPoolSize より少ない場合、キューがいっぱいの場合にのみ新しいスレッドが作成されます。

ThreadPoolこの状況でタスクをキューに送信する代わりに、新しいスレッドを開始するにはどうすればよいですか?

例:

corePoolSize=5 と maxPoolSize=10 のスレッドと無制限のキューがあります。

corePoolSizeスレッドが現在ビジーで、新しいタスクが到着したとします。プールは新しいスレッドを開始し、新しいタスクを実行する必要があります。

maxPoolSizeスレッドが現在ビジーで、新しいタスクが到着したとします。プールはタスクをキューに永続化する必要があり、最初に空きスレッドがこのタスクを取得して実行する必要があります。

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

java - ノンブロッキング方式でファイルアップロードを処理する

背景スレッドはこちら

目的を明確にするために、ユーザーは大きなファイルをアップロードし、さまざまな操作を続行するためにすぐに別のページにリダイレクトする必要があります。ただし、ファイルが大きいため、コントローラーのInputStreamから読み取るのに時間がかかります。そのため、このI/Oを処理するために新しいスレッドをフォークすることにしました。コードは次のとおりです。

コントローラサーブレット

モデルクラス

ランナブル_

私の質問/疑問:

  1. サーブレットから手動でスレッドを生成することは論理的には理にかなっていますが、コーディングに関しては怖いです-結局、コンテナはこれらのスレッドを認識していません(私はそう思います!)
  2. 現在のコードは非常に明白な例外を与えています-run()メソッドが完了する前にdoPost(...)メソッドが戻るため、ストリームにアクセスできません

    /li>
  3. ポイント1を念頭に置いて、Executorフレームワークの使用はとにかく私を助けますか?

    /li>

では、(アップロードされた)ファイルをストリームから読み取れるように、ユーザーがブロックせず、ストリームにアクセスできるようにするにはどうすればよいですか?

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

java - Java でタスクの順序実行を指定する

私はたくさん検索しましたが、解決策が見つかりませんでした。私は次のようにJavaスレッドプールを使用します:

このようにして、タスクは結果の順序で (キューのように) 実行されます。しかし、「次のタスクを選択する」戦略を変更する必要があります。したがって、各タスクに割り当てて優先度を指定し(スレッドの優先度ではありません)、これらの優先度に対応するタスクを実行します。そのため、エグゼキュータが別のタスクを終了すると、次のタスクを最大優先度のタスクとして選択します。一般的な問題について説明します。優先順位を考慮しない、より単純なアプローチがあるかもしれません。最初に追加されたタスクではなく、最後に追加されたタスクを次に実行するように選択します。大まかに言うと、FixedThreadPool は FIFO 戦略を使用します。たとえば、LIFO 戦略を使用できますか?

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

java - サービスを終了せずに ScheduledThreadPoolExecutorService の遅延を変更する

名前が示すように、Executor サービスを使用してデーモンをスケジュールするデーモン フレームワークがあります。

Runnable実行時に、アプリケーションを終了せずに、クラスの 2 つの実行間の遅延を変更したいと考えています。

出来ますか?はいの場合、どのように?

0 投票する
5 に答える
27034 参照

java - ThreadPoolExecutor のすべてのワーカーをすぐに強制終了する方法

内にいくつかのタスクがありTheadPoolExecutorます。インターフェイスに停止ボタンがあり、内部のすべてのスレッドをThreadPoolExecutorすぐに終了する必要があります。私はそれを行う方法を探しています。(shutDown()またはなしshutDownNow())。

ありがとう

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

java - Java エグゼキュータ サービス

JAVAで以下のコードを作成するExecutorService と、誰かがその仕組みを説明できますExecutorServiceか?

単一の作業キューがあり、for ループがRunnableこのキューに 500 のタスクを追加すると思います。これExecutorServiceで、400 スレッドのスレッド プールで が作成されました。

キュー内の 500 個のタスクのうち、400 個のスレッドがExecutorServiceこの 400 個のタスクを一度に実行し、残りのスロットは解放されるのでしょうか?

私の理解は正しいですか?

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

java - ThreadPoolExecutorがメモリリークを起こしていませんか?

ThreadPoolExecutorタスクを実行するためにを使用し ています。バックエンドは、SynchronousQueueであるため、エグゼキュータがすでにタスクを実行している場合は、をスローしRejectedExecutionExceptionます。簡単なテストケースは次のとおりです。

予想される動作は次のとおりです。ワーカーを実行し、1秒間スリープした後、i(ワーカーがこれまでに実行された頻度を表す)とワーカーが作成されてからのミリ秒数を出力します。だから私は期待しています:

これはしばらくは問題なく動作しますが、ほぼ1時間後には次のようになります。

したがって、あるワーカーの実行から次のワーカーの実行までの時間は、20秒(2919-> 2920)および38秒(2920-> 2921)などになります。すべてが非常に遅くなり、jvmはガベージコレクションに多くの時間を費やします。最後に(数日後)OutOfMemoryErrorが発生しました。

64ビットLinuxマシン上のOracleのJVM1.7.0_07で、これを-Xmx8M(ヒープスペースが増えると効果がかなり後で現れると思います)で実行しています。ポインタをいただければ幸いですが、おそらく私は明らかなことを見逃しているだけです。

0 投票する
4 に答える
28738 参照

java - ThreadPoolExecutor は、カスタム動作でスレッド プールを修正しました

私はこのトピックに不慣れです...私は Executors.newFixedThreadPool( 10 ) で作成された ThreadPoolExecutor を使用しており、プールがいっぱいになった後、 RejectedExecutionException を取得し始めています。プールが解放されたときに新しいタスクを拒否して開始するのではなく、エグゼキューターに新しいタスクを「待機」状態にするように「強制」する方法はありますか?

ありがとう

この https://github.com/evilsocket/dsploit/issues/159に関する問題

関連するコード行https://github.com/evilsocket/dsploit/blob/master/src/it/evilsocket/dsploit/net/NetworkDiscovery.java#L150

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

java - Spring JPA マルチスレッド

私たちは製品を構築しているので、パフォーマンスの観点から助けが必要です。完全な Spring (MVC、JPA、セキュリティなど) を使用しています。

たとえば、特定のフローで 100 個のビジネス ルールを同時に実行できるという要件があります。nこのようなフローとビジネス ルールは多数存在する可能性があります。

これらのルールを実行すると、実際にデータベース内のテーブルからレコードがフェッチされます。これらには、LAZILY INITIALIZED ENTITIES もほとんど含まれません。

マルチスレッドの目的でFutures/を使用しましたが、問題は LAZY 変数のロードに失敗することです。CallablesHibernate の読み込み例外が発生します。おそらく、TRANSACTIONAL で別のスレッドに分散されないという問題があります。

他にアプローチする方法があれば教えてください。

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

java - APIレスポンダとしてのJava ExecutorCompletionService

ServerSocket着信クエリをリッスンするサーバー アプリケーションがあります。クエリを送信するクライアントは、サーバーへのソケットを開き、クエリを上流に渡し、(おそらく短時間の後に) クエリの送信に使用したのと同じソケットからクエリへの応答を読み取ることを期待しています。

このために、私はを使用しようとしていますExecutorCompletionService。さまざまなクエリ クラスがさまざまな に渡されますCallableが、すべてが結果として a を返すことが期待されStringます。

実際にクライアントに返信しようとする段階に達するまで、これらすべては非常に扱いやすいものです。現在、Futureオブジェクトはすべて typeFuture<String>ですが、その結果 ( String) を適切なに結合できませんSocket

私の解決策は、すべてのCallables を次のような型Callable<StringSocketPair>にすることです。StringSocketPair

しかし、これはすべて少し奇妙に思えます。コンストラクターに を渡してSocket、メソッドからの結果Callableと一緒にそれを返すことができるようにする必要があるからです。をポーリングするさらに別のスレッドにプッシュできるようにするためです。Stringcall()StringSocketExecutorCompletionService.take()

もう 1 つのオプションは、Runnables の代わりにCallables を使用し、各Runnableタスクを独自に応答させることですが、12 種類ほどのクエリ タイプがあるため、それぞれに独自のタスク オブジェクトがあり、いくつかの呼び出しSocketを追加する必要はありません。すべてのタスク オブジェクトrespondToClient()のすべてのメソッドの末尾に種類を設定します。run()

かなり一般的なセットアップであると私が考えるものには、より簡単な解決策が必要ですか?