大規模なポリシーを拒否Javaスレッドプール8、インタビューが要求されます!

ExecutorServiceのインターフェースよりも最もよく知られたJavaスレッドプール、大きくマルチスレッドコードの開発を簡素化JDK1.5新しいjava.util.concurrentパッケージ、下にこのAPIを話します。あなたは、その実装の後ろFixedThreadPoolを使用するかどうか、まだCachedThreadPool ThreadPoolExecutorです。ThreadPoolExecutorプールバッファプールのサイズは、プールが拒否ポリシーを含む、キャリアの十分な量でない場合ので、生成物の典型的な設計です。JDKは、以下の詳細なシーンに連動して、4つのプリセットのスレッドプールの拒否戦略を持っているこれらの戦略の話のシーンを使用して、我々は拡大可能性ポリシーを拒否します。

プールのデザインのアイデア

プールの設計は、それは新しい用語ではありません。私たちの共通のスレッドプールJavaなど、JDBC接続プール、Redisの接続プールは、設計、実装のこのタイプを表すためです。最初はデフォルトのリソースは、問題を解決するだろう。このデザインは、スレッド生成のオーバーヘッドなどのリソースへの各アクセスの消費量をオフセットオーバーヘッドようにリモート接続してを得ることです。あなたが食べるためにお弁当の食品を保持するに直接来て、いくつかの飯盛の良い所を置くカフェテリアDafan Dafan叔母に行くように、彼らは一時保留米や食品の戦いを持っていない、効率が高いです。これらの機能は、Javaスレッドプールとデータベース接続プールの属性メンバーに直接マッピングすることができる等の初期値、池の活性値、池最大池、:初期化リソースに加えて、さらにプールこれらの機能の設計を含みます。

スレッドプールのトリガタイミングは戦略を拒否しました

そして、データソースの接続プールは、スレッドプールや池最大の初期サイズは、複数のキューがバッファをブロックしていることを除いて、同じではありません。データソース接続がポリシー要求がトリガされた拒否一般的なプールに接続されている接続プールの最大数を超え、待機時間ブロッキング戦略は、一般的に直接的にスローされた例外が設けられています。

スレッドプール拒否ラフをトリガーする際に知りたい、タスクが提出されたときに、単純には、拒否のラフをトリガーするスレッド内のスレッドの最大数を超えているのではなく、三つのパラメータ上記の明確かつ具体的な意味は、これら3つのパラメータの結果の全体的な調整を必要とします数がcorePoolSizeよりも大きい場合には、プライオリティキューバッファを置く、バッファが満たされているだけで、現在実行中のタスクがmaxPoolSizeよりも大きいかどうかを決定します、新しいスレッド処理が未満で作成されます。それは拒否戦略を起こしより大きい。

**

拒絶ポリシーインタフェースの定義:

[Javaの]

__プレーンテキストビューでコードをコピー

 

public interface RejectedExecutionHandler {

void rejectedExecution(Runnable r, ThreadPoolExecutor executor);

}

インターフェイス定義は、トリガ拒否ポリシー、スレッドプールを使用すると、現在自身が特定の治療法は、異なるシナリオが別の考慮事項があります何のために、あなたに対処するために渡されたタスクとスレッドプールインスタンスにコミット具体的な戦略を、設定呼び出したときに、非常に明確です私たちが達成するためにJDKを構築するもので、見てみましょう:

CallerRunsPolicy(発信者の操作戦略)

[Javaの]

__プレーンテキストビューでコードをコピー

 

public static class CallerRunsPolicy implements RejectedExecutionHandler {

public CallerRunsPolicy() { }

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

if (!e.isShutdown()) {

r.run();

}

}

}

関数は:トリガ拒否ポリシーは、例外を直接スローを実行することを拒否した場合には、サスペンションのポリシーは、実行の電流を遮断するためのものです

使用シナリオ:これは何の特定のシーンではありませんが、例外処理をスローする権利のこと。ThreadPoolExecutorのデフォルトの戦略は、デフォルトはこれですので、ポリシーを否定するためExecutorServiceのシリーズThreadPoolExecutorインターフェイスの設定は示されていない、AbortPolicyです。

DiscardPolicy(破棄ポリシー)

[Javaの]

__プレーンテキストビューでコードをコピー

 

public static class DiscardPolicy implements RejectedExecutionHandler {

public DiscardPolicy() { }

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

}

}

特徴:直接静かに任意のアクションをトリガしません、このタスクを破棄

使用シナリオ:あなたが提出するタスクが関係ない場合は、あなたがそれを使用することができます。それが達成空であるので、それは静かにあなたのタスクを飲み込むます。だから、これは基本的な戦略ではありません

**

DiscardOldestPolicy(旧戦略を放棄)

[Javaの]

__プレーンテキストビューでコードをコピー

 

<strong>`パブリック 静的 クラス DiscardOldestPolicyの 実装 のRejectedExecutionHandler {`

public DiscardOldestPolicy() { }

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

if (!e.isShutdown()) {

e.getQueue().poll();

e.execute(r);

}

}

}</strong>

機能:スレッドプールが閉じていない場合は、キューの先頭に要素をポップして、実行しようとします

使用シーンは:この戦略はまだ廃棄タスク、だけでなく、廃棄されたが、廃棄された古いタスクによって特徴付けられていない音が行われていないだろう、とのタスクが実行されるために高い優先順位です。

メッセージこの機能に基づいて、私は、そのシーンを考え、送信メッセージ、ニュースリリースが出て行った後に、メッセージを変更することができますが、再びニュースを更新し、実装されていなかった、メッセージの今回のバージョンは、それが今よりもエグゼクティブによって提出されていません下位バージョンを破棄することができます。キューは、メッセージが実行のためにキューイングされるメッセージの下のバージョンが存在する可能性があるので、あなたが実際に処理するときに、そのメッセージは朗報バージョンの比較でなければなりません

 

公開された964元の記事 ウォン称賛11 ビュー30000 +

おすすめ

転載: blog.csdn.net/xiaoyaGrace/article/details/105400452