問題タブ [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 投票する
8 に答える
73312 参照

java - 呼び出し可能なスレッドに名前を付ける方法は?

ExecutorServiceスレッドプールを使用してCallableObjectを実行しています。このスレッドに名前を付けたいと思います。

より具体的には、古いバージョンではこれを行いました-

log4jロギングでスレッド名を使用しています。これは、トラブルシューティング時に非常に役立ちます。現在、コードをJava1.4からJava1.6に移行しています。私はこれを書きました(以下に与えられます)-しかし、私はこのスレッドに名前を付ける方法を知りません。

このスレッドに名前を付けるためのアイデアを教えてください。

0 投票する
6 に答える
3636 参照

java - Java ThreadPool の使用

マルチスレッドの Web クローラーを作成しようとしています。

私のメインのエントリ クラスには、次のコードがあります。

URLCrawler は、指定された URL をフェッチし、HTML を解析してそこからリンクを抽出し、見えないリンクを最前線に戻すようにスケジュールします。

フロンティアは、クロールされていない URL のキューです。問題は get() メソッドの書き方です。キューが空の場合は、URLCrawlers が終了するまで待ってから再試行する必要があります。キューが空で、現在アクティブな URLCrawler がない場合にのみ null を返す必要があります。

私の最初のアイデアは、現在動作中の URLCrawler の数をカウントするために AtomicInteger を使用し、notifyAll()/wait() 呼び出しに補助オブジェクトを使用することでした。各クローラーは、開始時に現在動作中の URLCrawlers の数を増やし、終了時にそれを減らし、完了したことをオブジェクトに通知します。

しかし、notify()/notifyAll() と wait() は、スレッド通信を行うためのやや非推奨のメソッドであると読みました。

この作業パターンでは何を使用すればよいですか? M の生産者と N の消費者の場合と同様に、問題は生産者の疲弊にどう対処するかです。

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

java - ConcurrentHashMap に欠点はありますか?

複数のスレッドからアクセスできる HashMap が必要です。

通常の HashMap を使用して同期する方法と、ConcurrentHashMap を使用する方法の 2 つの簡単なオプションがあります。

ConcurrentHashMap は読み取り操作でブロックしないため、私のニーズにははるかに適しているようです (ほとんど読み取りだけで、更新はほとんどありません)。一方、同時実行性は非常に低いと予想されるため、ブロッキングは発生しないはずです (ロックを管理するコストのみ)。

それが違いを生む場合、マップも非常に小さくなります (10 エントリ未満)。

通常の HashMap と比較して、読み取り操作と書き込み操作のコストはどのくらい高くなりますか? それとも、読み取り/更新の比率とサイズに関係なく、中程度のレベルの同時アクセスが存在する可能性がある場合でも、ConcurrentHashMap は常に優れているのでしょうか?

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

java - セマフォの取得に失敗したスレッドはどうなりますか?

スレッドがセマフォを取得できない場合 (許可がないため) はどうなりますか。待ち状態に移行しますか?

EDIT:セマフォが利用可能になると、スレッドの開始は前の実行シーケンスを再開します。

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

java - java.util.concurrentクラスを使用するときに可視性の問題を回避するために同期する必要がありますか?

java.util.concurrentクラスのいずれかを使用する場合でも、異なるスレッド間の可視性の問題を回避するために、インスタンスのアクセスを同期する必要がありますか?

質問をもう少し詳しく説明します

java.util.concurrentのインスタンスを使用する場合、1つのスレッドがインスタンスを変更し(つまり、要素を並行ハッシュマップに配置し)、後続のスレッドが変更を認識しない可能性はありますか?

私の質問は、値へのアクセスが同期されていない場合、Javaメモリモデルでは、スレッドがメモリから直接値をフェッチするのではなく、値をキャッシュできるという事実から生じます。

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

java - Guava MapMaker().weakKeys().makeMap() vs WeakHashMap

ソケットを介して Protocol Buffers を使用してノード ツリーを取得する Scala サーバーがあり、各ノードに追加のデータをアタッチする必要があります。

シングル スレッド コンテキストで、ノード ツリーと関連データの両方で強い参照が同時に削除される場合 (スコープ外になるため)、WeakHashMap を使用するよりも Google Guava の MapMaker を weakKeys() で使用する理由はありますか? ? MapMaker では同期アクセスに料金がかかるようですが、この場合は必要ありません。

余談ですが、MapMaker が等価設定へのアクセスを許可し、弱い参照やソフト参照を気にせずに参照の等価性を選択できるようにすると便利です。

0 投票する
10 に答える
172094 参照

java - 同期とロック

java.util.concurrentAPIは、と呼ばれるクラスを提供します。このクラスは、Lock基本的に、重要なリソースにアクセスするためにコントロールをシリアル化します。park()やなどのメソッドを提供しunpark()ます。

synchronizedキーワードとusingandwait()メソッドを使用できれば、同様のことができますnotify() notifyAll()

これらのどれが実際に優れているのか、そしてその理由は何ですか?

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

java - Java Future.get(timeout) が信頼できないのはなぜですか?

Future.get(timeout) は、指定されたタイムアウト後に TimeoutException を確実にスローしません。これは正常な動作ですか、それとも信頼性を高めるために何かできることはありますか? このテストは私のマシンでは失敗します。ただし、2000 ではなく 3000 でスリープすると合格します。

}

0 投票する
6 に答える
4201 参照

java - Java の並列処理

並列処理をサポートする Java の Intel TBB のようなライブラリはありますか。

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

java - 追加のリクエストをキューに入れずにタスクをシングル スレッド化する

タスクが完了するまでそれ以上のリクエストを破棄しながら、タスクを非同期で実行する必要があります。

メソッドを同期すると、タスクがキューに入れられるだけで、スキップされません。最初は SingleThreadExecutor を使用することを考えていましたが、それもタスクをキューに入れます。次に ThreadPoolExecutor を調べましたが、キューを読み取って実行するタスクを取得するため、1 つのタスクが実行され、少なくとも 1 つのタスクがキューに入れられます (その他は ThreadPoolExecutor.DiscardPolicy を使用して破棄できます)。

私が考えることができる唯一のことは、セマフォを使用してキューをブロックすることです。私が達成しようとしていることを示すために、次の例を用意しました。もっと簡単な方法はありますか?明らかな何かを見逃しましたか?

サンプル出力

axtavt の回答を取得し、上記の例を変換すると、次のより簡単なソリューションが得られます。