例セマフォのスレッド

 

 

アウトライン


インターフェースの応答速度を改善するために使用することができるThreadPoolExecutor +のRunnable  またはThreadPoolExecutor同時呼び出しの  技術を並列実行タスク。しかし、ThreadPoolExecutorは、コアスレッドが要求を満たすには不十分であるとき、タスクがキューに追加されるという特徴を有しています。キューを使用することにより、キューまたはキューメモリ・オーバーフローの問題が発生し爆発するように見えることがあります。

できるだけ早く対応のインタフェース速度を提供するために、私たちは、キューのプロパティの単語を使用する必要はありません。あなたは何をするセマフォを使用することができます。

セマフォセマフォの権限のセットを管理するには、最初に操作を実行する権限を取得し、使用後にライセンスを解放する必要があります。ライセンス、許可まで取得方法のブロックを持っていない場合。

 

シンプルなセマフォの例

セマフォを使用してThreadPoolExecutor

ThreadPoolExecutorでは、我々は、時間的にコアスレッドパラメータを定義し、例えば、セマフォを使用してときに、初期化パラメータはまた、10に設定され、10として定義されます。

Semaphore<Integer> sem= new Semaphore<>(10);

キューを使用しない場合ThreadPoolExecutorは、スレッドプール内のみコアスレッドが仕事で常にであることを保証する必要があります要求が多すぎる続いたときに、コアスレッドがハンドルに、しかし、とき、セマフォのブロッキングました

ただ、ブロッキング、スレッドの実行後にそのときにのみ、特定のコアスレッドを確保することは、それを脱ぎました。

 

本明細書で使用する場合、本例では、セマフォの同時使用をプログラミング基本的なJavaを説明するために。

public class BoundedHashSet<T> { public static void main(String[] args) throws Exception { BoundedHashSet<String> set = new BoundedHashSet<>(2); set.add("1"); set.add("2"); set.remove("2"); set.add("3"); System.out.println(JSON.toJSONString(set)); } private final Set<T> tempSet; private final Semaphore sem; public BoundedHashSet(int size) { this.tempSet = Collections.synchronizedSet(new HashSet<T>()); sem = new Semaphore(size); } public boolean add(T o) throws Exception { sem.acquire(); boolean isAdd = false; try{ isAdd = tempSet.add(o); return isAdd; } finally { if (!isAdd) { sem.release(); } } } public boolean remove(Object o) { boolean isRemoved = tempSet.remove(o); if (isRemoved) { sem.release(); } return isRemoved; } } 

ここでは例の実装では、ブロッキング有界 HashSetののを。HashSetのは、あなたが第三の要素を保存したい場合は、誰かHashSetのは、要素を削除するまで、待つ必要があり、二つの要素を格納することができます。

我々は、通常の追加要素に適用することができる場合、各追加する前に、ライセンスを申請します。対象とならない、そして取得()メソッドは常にブロックされます。動作中を除く、運転免許証のリリースがあります。

 

おすすめ

転載: www.cnblogs.com/awkflf11/p/12637521.html