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

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

java - Thread.interrupt() および java.io.InterruptedIOException

Solaris 10 で Java 1.5 を実行しています。私のプログラムは、Java 同時実行パッケージと log4j-1.2.12.jar を使用して特定の情報をログに記録するスタンドアロンの Java プログラムです。主なロジックは以下のとおりです

私のプログラムの実行中に、時々(常にではありませんが)このエラーが発生します...

super.run(); によって内部的に使用されるワーカー セットからワーカーが既に削除されているため、呼び出しから戻った後に AppThread を中断することはできThreadPoolExecutorません。エグゼキューターはその時点から AppThread への参照を持っていません。

ところで:ログファイルにアクセスでき、サイズは十分に大きいです。

33は次の行です。if (debug) logger.info("Exiting " + getName());

別の問題は、の原因をデバッグするためにjava.io.InterruptedIOException、追加したことです

runAppThreadのメソッドの finally 句で。whenInterruptedException が finally 句でキャッチされると、オーバーライドinterrupt()メソッドが呼び出されることはありません。AppThread を中断するのは誰ですか? 同じ男の原因java.io.InterruptedIOExceptionですか?

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

java - オブジェクトのロック情報を知る必要がある

Java で、グローバル スコープを持つオブジェクトを作成しました。

ある時点で、私は別のスレッドにいて、グローバル オブジェクトが現在いずれかのスレッドによってロックされているかどうかを知る必要があります。

  • クリシュナ
0 投票する
1 に答える
191 参照

java - Javaでのロック取得の遅延通知

ロックの取得に5分以上かかる場合は、ロックを取得して通知を送信する必要があるユースケースがあります。私たちはまだ永遠にロックを待つ必要があります。

リエントラントロックを使用していますが、lock.tryLock(5、TimeUnit.Minutes)は、5分後に出力されるため十分ではありません。

私たちが試したオプションは次のとおりです。

しかし、これはロックの公平性(ロックが要求された順序)を失う結果になると思います

誰かがそのようなユースケースに直面しましたか?はいの場合、それがどのように解決されたかを説明してください。

あるコンテキストでロックと対応する待機スレッドのメタ情報(ロック取得のために開始されたときなど)を維持する手作業のソリューションを使用したくない場合、別のスレッドがこのコンテキスト全体を継続的にポーリングして、待機している待機スレッドがあるかどうかを確認します5分以上。

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

java - JavaのExecutorとExecutorCompletionserviceの違い

質問のタイトル自体が言うように、Java の Executors クラスと ExecutorCompletionService クラスの違いは何ですか?

私はスレッディングが初めてなので、誰かがコードで説明できれば、それは大いに役立ちます。

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

java - 複数のモニターを使用した BlockingQueue の設計

私は BlockingQueue を書いていますが、他の実装がこの問題をどのように解決するのか疑問に思っています:

モニター (キュー オブジェクト) が 1 つしかなく、プロデューサーとコンシューマーを許可する場合、代わりに呼び出されるwaitことを確認する必要があります。そうしないと、プロデューサーは、キューがいっぱいの場合でも、別の待機中のプロデューサーに続行するように通知するだけです。物が入手可能であっても消費者を待たせる。一方、呼び出しは、多くのスレッドやプロセッサにとってスケーラブルなソリューションではないようです。notifyAllnotifynotifyAll

BlockingQueueは 2 台のモニターを使用しますか? 1 つは生産者の待機で、もう 1 つは消費者の待機でしたか? 次に、キューと関連するモニターをカプセル化された方法で同期する必要があります。それは行く方法ですか?

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

java - ExecutorServiceの奇妙な動作

Executors.newFixedThreadPool(8)によって作成されたExecutorServiceの8つのスレッドで実行される5000の同様のCallableタスクがあります。各タスクはデータベースに移動して、処理する大量のデータを取得します。

すべてが99%の時間正常に動作しますが、DBが遅いかスタックしている場合(理由は聞かないでください)、ログファイルに非常に奇妙な実行ログメッセージが表示されることがあります。現在実行中の8つのタスクが停止し、8つのスレッドすべてでまだ完了していません。 、ExecutorServiceは、1つずつ実行するタスクの送信を開始します。

したがって、ログは、ある時点でExecutorServiceがクレイジーになり、前のタスクが完了するのを待たずに、待機キュー内のCallableのCallableのcall()メソッドの呼び出しを開始することを示しています。ますます多くのタスクがDBにリクエストを送信し、最終的にDBがひざまずき、Javaヒープメモリが使い果たされます。

ExecutorService内で何か奇妙なことが起こっているか、状況の私の理解が間違っているようです。誰かがそのようなものを見たことがありますか?

私の脳のスタックが溢れています

psは、JavaAPIからの引用です。

Executors.newFixedThreadPool(int nThreads)

共有の無制限キューで動作する固定数のスレッドを再利用するスレッドプールを作成します。どの時点でも、最大でnThreadsスレッドがアクティブな処理タスクになります。すべてのスレッドがアクティブなときに追加のタスクが送信されると、スレッドが使用可能になるまでキューで待機します。シャットダウン前の実行中に障害が発生したためにスレッドが終了した場合、後続のタスクを実行するために必要な場合は、新しいスレッドが代わりに使用されます。

これは実際に私のタスクによってスレッドが停止し、ExecutorServiceがより多くのスレッドを作成して新しい8つのタスクをそれらに送信し、それらが停止してExecutorServiceがさらに8つのスレッドを作成し、さらに8つのタスクを送信するということが起こりますか?

pss:Callableのcall()内の操作全体がtry catchで囲まれているため、操作内で例外が発生した場合、例外がキャプチャされてログに記録されます。これは何も起こっていません。呼び出しが呼び出されて戻ることはありませんが、次のタスクは1つずつ呼び出され、戻ることも終了することも、例外をスローすることもありません。

自分のタスクが原因でスレッドプール内のスレッドが停止しているのではないかと思います。どうすれば模倣できますか?

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

java - Javaの特定の条件でスレッドをブロックする

たぶんこれは本当にばかげた質問ですが、私に聞いてください。特定の入力日に何かを実行するための多数の同時リクエストを受け取るユースケースがあります。同じ入力日に2つの同時リクエストを受信した場合、(正当な理由で)前のリクエストが完全に終了するまで、後続のリクエストを続行しないでください。これを実現するために標準のjava.util.concurrentコンポーネントを使用する最良の方法は何ですか?私の最初の考えは、ロックを販売し、それが使用中であり、後続の要求がawait()されることを示すためにコピーを保持するLockFactoryを使用することでした。ただし、これにはボイラープレートコードがたくさんあるようです-私を避けているもっと簡単なトリックはありますか?

前もって感謝します!

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

java - AtomicBooleanを使用してブロックして待機する方法

スレッドを一時停止する方法を探しています。

ブールフラグ(「一時停止」と呼ばれる)を効果的に使用し、チェックをwhileループ(一時停止)でラップすることから始めました。

whileループ内にはThread.wait()、実行をブロックするためのがあります。

私はAtomicBooleanを見てきました。これは、ブロックされないことを除けば、トリックを実行しているようです。

ブロックメソッドを持つAtomicBooleanの代替バージョンまたは拡張バージョンはありますか?

つまりAtomicBoolean.getFalse()AtomoicBoolean.get(false)

それらにはブロッキングキューがあるため、ブロッキング値です。

現在の設定は次のとおりです。

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

java - クラス Condition の await メソッドが InterruptedException をスローしない

Java SE 6 の Condition クラスの await メソッドに奇妙な問題があります。問題は、別のスレッドによる割り込み中に await メソッドが常に例外をスローするとは限らないことです。

ドキュメントには、次の場合に IE がスローされると書かれています。

... 他のスレッドが現在のスレッドを中断し、スレッド中断の中断がサポートされています ...

このサブセンテンスを解釈する方法: 「スレッド中断の中断がサポートされています」

例外をスローしないことは不可能のようです。同様の問題がありましたか?

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

java - java.util.concurrent.Future はスレッドセーフですか?

java.util.concurrent.Future がスレッドセーフかどうかを示すドキュメントを探しています。たとえば、Future.get(...) をすべて呼び出す複数のスレッドに、Future の同じインスタンスを安全に与えることはできますか?

この方法で Future を使用してコードをテストしたところ、問題なく動作しているように見えますが、この方法での同時アクセスに対して future が安全であるという文書化された期待を見つけることができれば、もっとうれしいです。

ありがとう。