問題タブ [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 - Executors.newSingleThreadScheduledExecutor を使用せずに単一スレッドで ScheduledThreadPoolExecutor を作成するにはどうすればよいですか?
ScheduledThreadPoolExecutor
を使用せずに単一のスレッドでを作成するにはどうすればよいExecutors.newSingleThreadScheduledExecutor
ですか?
私がそうしたい理由は、後の呼び出しが のインスタンスではDelegatedScheduledExecutorService
なく のインスタンスを返すためです。そのため、 etc などThreadPoolExecutor
のメソッドを使用できるようにしようとするとgetQueue()
失敗します。ThreadPoolExecutor
直接作成できる場合は、それが役立ちます。
そして、私がそうしたい理由getQueue()
は、エグゼキューターで現在キューに入れられているタスクのサイズを知る方法が他にないからです。
java - Runnable から ScheduledJobThreadExecutor.afterExecute に情報を渡す
定期的なタスクをスケジュールし、ScheduledJobThreadExecutor を使用しています。runnable を実行すると、私の反応が必要なことが起こるかもしれませんが、それはタスクが終了した後にのみ発生する必要があります。
最初、私は aftetExecute でこの情報にアクセスできると思っていました。そこに Runnable を取得しているためです (そして、その状態を照会することはできません)。私が提出した元のランナブルではないことが判明しました! しかし、ScheduledFutureTask であり、元の Runnable をアンラップする方法が見つかりません。
私に何ができる?この種の要件のイディオムはありますか?
ありがとうございました!
java - ThreadPoolExecutor に処理を進めるかどうかを伝える
特定のポートを介して一連のファイルを複数のコンピューターに送信する必要があります。実際には、ファイルを送信するメソッドが呼び出されるたびに、宛先データ (アドレスとポート) が計算されます。したがって、メソッド呼び出しごとにスレッドを作成するループを使用し、BindException の try-catch ステートメントでメソッド呼び出しを囲み、既に使用されているポートを使用しようとするプログラムの状況を処理します (宛先アドレスが異なると、同じポートを介してメッセージを受信する) スレッドに、数秒待ってから再起動して再試行し、例外がスローされなくなる (配送が正常に実行される) まで試行を続けるように指示します。理由はわかりませんでした (最初に見たときは推測できましたが)、Netbeans は、ループ内で Thread オブジェクトをスリープ状態にすることは最善の選択ではないことを警告しました。これは別のスタックオーバーフローの投稿へのリンクで、とても面白そうでした (私はThreadPoolExecutor クラスについて聞いたことがありませんでした)。プログラムを改善するために、そのリンクと API の両方を読んでいますが、それを自分のプログラムにどのように適用すればよいか、まだよくわかりません。誰でもこれについて手を差し伸べてもらえますか?
編集:重要なコード:
java - 常に一意のIDを取得し、再利用のためにリリースします
問題の説明は次のとおりです。-
各スレッドはunique ID
between1 and 1000
を使用し、プログラムは実行する必要があります。チェックを行っ60 minutes or more
たときに数回run method
取得し、そのループの下にブレークポイントを設定しました。理由はわかりません。availableExistingIdsの値は1から1000の範囲であるため、これがどこから来たのかわかりません。id as zero
(if(id==0))
zero is coming in my id
以下は、プログラムが開始されるメインクラスです-
アップデート:-
ここでArrayBlockingQueueを使用して、使用可能なIDがないときにクラッシュするのではなく、IDが使用可能になるのを待つようにしようと考えていました。誰かが私にそれをここでどのように使用できるか提案できますか?
BlockingQueueの実装後のコード変更。
私が今気づいた奇妙なことの1つは、以下のelse if loop
ように、上記のコードが表示されているrun method
場合はcommand.getDataCriteria() is Previous
、それが入力されてelse if block(which is for New)
いること.equals check
です。なぜこれが起こっているのですか?
java - 同じコマンド属性を変更する複数のスレッド
問題文:-
以下のプログラムでは、を使用ThreadPoolExecutor
していArrayBlockingQueue
ます。
各スレッドはUNIQUE ID
毎回使用する必要があり、実行する60 minutes or more
必要があり60 minutes
ます。そのID's will get finished
ため、これらのIDを再利用する必要があります。だから私はArrayBlockingQueue
ここでコンセプトを使用しています。
2つのシナリオ:-
command.getDataCriteria()
が含まれている場合、Previous
各スレッドは常にそれを使用UNIQUE ID between 1 and 1000
して解放し、再利用する必要があります。- それ以外の場合、
command.getDataCriteria()
が含まれている場合、New
各スレッドは常にそれを使用UNIQUE ID between 2000 and 3000
して解放し、再利用する必要があります。
以下のプログラムで現在直面している問題-
私が直面している問題の1つは
run method
もしそうなら、それcommand.getDataCriteria()
はまた、正しく起こってはならないものPrevious
に入力されますか?else if block(which is for New)
そしてまた私はやってい.equals check
ますか?なぜこれが起こっているのですか?多くのスレッドが同時に起動し、以前にコマンドを変更したことが原因である可能性がありますか?
else if(command.getDataCriteria().equals("New")) {
マルチスレッドがそれを変更している場合、どうすればこの問題を克服できますか?どんな問題が起こっていても、それはで起こっていrun method
ます。私は長い間これに固執しているので、どんな提案も大いに役立つでしょう。たぶん私たちはする必要がありますSynchronize the threads, so that no other thread should modify the command when another thread is trying to execute it.
runnable(実ユニットレベルのコマンドエグゼキュータ)の実装
これにご協力いただきありがとうございます。ありがとう
getNextCommandToExecute method
更新-マットによって提案されたコード
そして、コマンドはクラスのトップで次のように宣言されています-
もう1つの方法を更新します:-
java - ThreadPoolExecutorのすべてのタスクがそこでジョブの実行を終了したら、データベースに挿入します
問題の定義:-
insert some values into Database
のすべてのタスクがExecutorService
そこでジョブの実行を終了したらすぐに実行する必要があります。言い換えると、insert into database
dbに挿入する必要があるものは、そこでタスクを終了するすべてのスレッドに依存しているため、すべてのタスクがそこでジョブの実行を終了した場合にのみ実行できます。
では、のすべてのタスクの実行が終了したかどうかを確認しExecutorService
てから、データベースへの挿入を開始するにはどうすればよいですか。
以下は、を使用してタスクを作成しているコードですThreadPoolExecutor
。
挿入に使用するコードは以下のとおりです-
したがって、すべてのタスクの実行が終了した後、このforループをどこかに配置する必要があります。
アップデート:-
だからこのようなもの-
threadpoolexecutor - ThreadPoolExecutor 使用時のサーバー クラッシュの処理方法
RejectedExecutionException をキャッチし、適切に処理します。しかし、サーバー/jvm が突然クラッシュした場合、どのようにケースをキャッチして処理すればよいか知りたいです。誰でもここで私を助けてくれませんか?
java - Java Webapp Executors クラス
Java - webapp は、Executors クラスを介して次のコードとしてスレッドを実行し、固定プール サイズで実行する利点は何ですか。
java - マルチスレッドと ThreadPoolExecutor
私は自分が書いた多くのアプリケーションでマルチスレッドを使用してきました。もっと読んでいるうちに出くわしThreadPoolExecutors
ました。この 2 つのシナリオを区別することはできませんでした。
それでも私が理解しているのは、タスクを複数の小さなタスクに分割してCPUを利用し、作業を高速化したいタスクがある場合は、マルチスレッドを使用する必要があるということです。またThreadPoolExecutor
、タスクのセットがあり、各タスクを互いに独立して実行できる場合に使用します。
間違っていたら訂正してください。ありがとう
java - ExecutorService を使用してジョブを並列処理する
多くの URL を処理する必要がある Java プログラムを作成しています。
各 URL は次のジョブを順番に実行します: ダウンロード、分析、圧縮
URL ごとに 1 つのスレッドですべてのジョブを一度に実行するのではなく、各ジョブに一定量のスレッドを持たせて、すべてのジョブで同時にスレッドが常に実行されるようにします。
たとえば、ダウンロード ジョブには、URL を取得してダウンロードするための複数のスレッドがあり、URL の 1 つがダウンロードされるとすぐに分析ジョブのスレッドに渡され、完了するとすぐに次のスレッドに渡されます。圧縮ジョブのスレッドなど
終了するとすぐに結果を返すため、JavaでCompletionServiceを使用することを考えていますが、それがどのように機能するかわかりません。これまでのところ、私のコードは次のようになります。
私の質問は、ダウンロードしたアイテムを分析ジョブに移動し、すべてのダウンロード ジョブが完了するのを待たずにそこで作業を行うにはどうすればよいですか? ジョブごとに CompletionService を作成することを考えていますが、それは実行可能な方法ですか? そうでない場合、この問題を解決するためのより良い代替方法はありますか? 例を挙げてください。