問題タブ [java.util.concurrent]
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 - ロックを取得しようとするときに ReentrantLock#tryLock(long,TimeUnit) は何をしていますか?
ReentrantLock#tryLock(long,TimeUnit) の実装は、ロックを取得しようとすると何をしますか? スレッド A が のロックを実際に所有していて、myLock
スレッド B が呼び出していると仮定するとmyLock.tryLock(10,SECONDS)
、スレッド B はスリープ状態ですか、それとも待機状態ですか?
つまり、この 2 つの実装の違いは次のとおりです。
1.
2.
java - java.util.concurrent.LinkedBlockingQueue の奇妙なコード
全て!
LinkedBlockingQueue で奇妙なコードを見つけました:
ローカル変数 h が必要な理由を誰が説明できますか? GC にどのように役立ちますか?
java - wait()およびnotify()を使用したConcurrentLinkedQueue
私はマルチスレッドに精通していません。1つのプロデューサースレッドでスクリーンショットを繰り返し撮ろうとしています。これにより、BufferedImage
オブジェクトが追加されConcurrentLinkedQueue
、コンシューマースレッドがオブジェクトをpoll
キューにBufferedImage
入れてファイルに保存します。notify()
繰り返しポーリング(whileループ)することでそれらを消費することはできますが、とを使用してそれらを消費する方法がわかりませんwait()
。小さなプログラムで使用wait()
してみnotify
ましたが、ここでは実装できませんでした。
私は次のコードを持っています:
以前は、BufferedImage
オブジェクトの存在を確認するためにポーリングを繰り返していました。今、私はrun
メソッドを変更synchronised
し、実装しようとしましwait()
たnotify()
。私は正しいことをしていますか?助けてください。ありがとう。
java - スケジュールされたタスクの結果を取得する
私は Java 同時実行 API を学習しようとしています。私の演習では、ジョブを X 秒ごとに定期的に実行するようにスケジュールしたいと考えています。ジョブは乱数を計算します。
スケジュールされたタスクが終了したらすぐに結果を取得したい。API だけではこれを行うことができなかったので、ハックしました。
低レベルのメカニズムを使用せずに、これをより適切に行う方法はありますか? の同期を削除してMyRandomGiverTask.getResult()
、代わりに のようなものを使用できるようにしたいと考えていScheduledFuture.get()
ます。しかし、私のコードでは、ScheduledFuture は完了/完了していません。これは私の現在の解決策です:
java - javaはエグゼキュータを再利用します
私はシミュレーションシステムに取り組んでおり、各タイムステップで多くのモデルをシミュレートする必要があります。FixedThreadPoolを使用して、計算を高速化しました。
execute()
現在、を呼び出した後、エグゼキュータを新しいタスクに使用することはできませんshutdown()
。エグゼキュータをリセットして、次のシミュレーションステップで既存のエグゼキュータ(およびそのスレッド)を再利用できるようにする方法はありますか?
java - Javaでの同時データ挿入を処理するクラス
常に500以上のスレッドが一意のオブジェクトをバケットに同時にアップロードします。
この場合、Javaでバケットを実装するためにどのデータ構造/クラスを使用する必要がありますか。
ご参考までに:
ArrayList、Vector、ConcurrentHashMap、ArrayBlockingQueue、LinkedBlockingQueueを使用してみました。
ArrayListはスレッドセーフではないため、失敗します。ベクターは挿入により多くの時間を消費します。(モニターロックを取得するための待機時間が長いため)
...最後に、他の人と比較するのに適したArrayBlockingQueueを使用しました。
この場合、他に適切なクラス/データ構造が存在するかどうかを教えてください。
java - ForkJoinPool Tasks/action で Uncaught Exceptions を処理するより良い方法
ForkJoinPool
タスク (RecursiveAction
または) を送信するために使用しているときに、例外 (キャッチされない) を処理するより良い方法は何RecursiveTask
ですか?
ForkJoinPool は、Thread.UncaughtExceptionHandler
WorkerThread が突然終了した場合 (これはとにかく私たちの制御下にはありません)、例外を処理するために を受け入れますが、このハンドラーは がForkJoinTask
例外をスローする場合には使用されません。私は実装で標準submit
/invokeAll
方法を使用しています。
これが私のシナリオです:
サードパーティのシステムからデータを読み取る無限ループでスレッドを実行しています。このスレッドでは、タスクをForkJoinPool
私は RecursiveAction を使用しており、いくつかのシナリオでは RecursiveTask を使用しています。これらのタスクはメソッドを使用して FJPool に送信されsubmit()
ます。UncaughtExceptionHandler
タスクがチェックされていない/キャッチされていない例外をスローした場合に、例外を処理し、必要に応じてタスクを再送信できるような一般的な例外ハンドラーが必要です。例外を処理することで、タスクの 1 つまたは一部が例外をスローした場合に、キューに入れられたタスクが取り消されないようにすることもできます。
invokeAll()
メソッドは一連の ForkJoinTasks を返しますが、これらのタスクは再帰ブロックにあります (各タスクはcompute()
メソッドを呼び出し、さらに分割される可能性があります [仮想シナリオ] )
3 ~ 4 個のタスクが失敗すると、キュー送信ユニット全体が破棄されることに気付きました。現在、私はtry/catch
個人的に好きではないプロセスタスクを回避しています。より一般的なものを探しています。
- また、失敗したタスクのすべてのリストを知りたいので、それらを再送信できます
- タスクが例外をスローすると、スレッドはプールから追い出されますか?
- FutureTask でメソッドを呼び出す
get()
と、タスクが完了するまで待機するため、フローがシーケンシャルになる可能性が高くなります。 - Task が失敗した場合のみ、Task のステータスを知りたい。いつ完了するかは気にしません (明らかに 1 時間後に待ちたくありません)。
上記のシナリオで例外を処理する方法はありますか?
java - Thread.setUncaughtExceptionHandler が機能しない
以下のコードに示すようにスレッドの uncaughtExceptionHandler を設定しましたが、実行中のスレッドで HibernateException が発生すると機能しません。私のjvmは1.6.0_26です。どんな手掛かり?
java - ArrayBlockingQueue: プールの作成に使用する必要がありますか?
Pool
古いオブジェクトを再度使用する場合に備えて、古いオブジェクトを予約するオブジェクトを作成しようとしています (新しいオブジェクトのインスタンス化を避けるため)。私はそれをグーグルで検索しArrayBlockingQueue
、それを使用して作成する人もいますPool
。しかし、私が知らない質問が 1 つあります。それは、オブジェクトが挿入されたときに新しいインスタンスを再作成するかどうかです。
例えば:ArrayBlockingQueue<Integer> pool = new ArrayBlockingQueue<Integer>(3);
しばらくして:pool = (3,4,5);
では、古い Integer オブジェクト (値は 5) に 6 が割り当てられているのだろうか、それとも Java が新しいものを作成してその値を 6 として割り当てているのでしょうか?
ありがとう :)
java - 完了するのに一定の時間がかかるcallableを実装するためのJavaの最良の方法は何ですか
パスワードのブルートフォースから保護し、有効なユーザー名を検出しようとするタイミング攻撃から保護するために、認証が成功したかどうかに関係なく、ログインプロセスに一定の時間がかかるようにします。要するに、私は常に、結果に関係なく、ログインプロセスに1000msかかることを望んでいます(どちらの結果もその時間の何分の1かかかると仮定します)。Javaでこれを達成するための最良の方法は何ですか?これが私の現在の考え方です。