9

Javaのセマフォの概念とそれを理解しようとしていることがよくわかりません。

オラクルのドキュメント(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html)と他のいくつかのページを読んだ後の私の理解は、カウント付きのロックに似ています許可の数。

通常、リソースのプールを作成するために使用されます。ここで混乱します。スレッドのプールを提供できる ThreadPoolExecutor もあります。違いは何ですか?どちらがどのシナリオで使用されますか?

4

2 に答える 2

11

まず、馬鹿げた質問などありません...

セマフォを使用すると、複数のスレッドがリソースを「取得」できます。リソースが利用可能かどうかを確認する必要があります。流量制御用のバルブのようなものです。

ロックは排他的アクセス用です。一度に 1 つのスレッドのみ。

ThreadPoolExecutorを使用すると、限られた量のスレッドを使用して一部のコード (Runnable または Callable クラス) を実行できます。これを自分で作成する必要はありません。JSE API で既に実装されています。いくつかのセマフォとキューを使用して独自に行うこともできます...しかし、正当な理由がない場合は、時間を無駄にしないでください。

ポート 80 へのリクエストを受信する Web サーバーを実装する必要があることを想像してください。このポートをリッスンしている同じスレッドを使用してリクエスト全体を処理することは望ましくありません (これはリソースの無駄です...)。ThreadPoolExecutor を使用してリクエストを処理し、処理してクライアントに応答できます。ThreadPoolExecutor は、現在の CPU を活用するように構成できます。このアーキテクチャとタスクに最適な数の脅威です。

Concurrency in practiceは、この問題に関する知識を向上させるための優れた本です。

これがお役に立てば幸いです。私の基本的な英語で申し訳ありません。

于 2013-01-22T10:59:11.933 に答える
1

ThreadPoolは、まとめて管理できる1つ以上のスレッドのプールです。Javaの場合ThreadPoolExecutorには、実行可能または呼び出し可能を実行するためのキューもあり、タスクを制御したり結果を取得したりできるFutureを返すことができます。

セマフォを使用すると、多くの許可を取得できます。たとえば、最大2つのスレッドでコードを実行できます。目的を達成するには、多数のスレッドを実行する必要がありますが、それ以外の場合は無関係です。

ところで:Java 5.0はしばらくの間EOLであり、Java 6はほぼ無料サービスの終わりにあるので、私はJava7のドキュメントを読みます。

于 2013-01-22T10:31:57.637 に答える