利点と原則スレッドプール

  • スレッドプールを使用するメリット

    技術プーリング:スレッド・プール、データベース接続プールは、http接続プールを、というように。

    技術をプーリングの主なアイデアは、資源の利用率を向上させ、リソースへの各アクセスの消費量を削減することです。

    これは、スレッドプールの制限、資源管理戦略を提供します。スレッドプールはまた、このようなタスクの数など、いくつかの基本的な統計は、完成されている維持しています。

    スレッドプールの利点を使用します。

    • リソース消費を削減:作成されたスレッドを再利用することで、消費に起因するスレッドの作成と破壊を減らします。

    • 応答速度を改善:タスクが到着すると、すぐに実装することができ、スレッドの作成を待つ必要がないかもしれません。

    • スレッドの管理性を向上させる:スレッドが希少資源である、無限の創造場合、システムリソースを消費するだけでなく、システムの安定性を減らすだけでなく、スレッドプールを使用すると、監視とチューニング、統一配布することができます。

     

    二つのエグゼキュータのフレームワーク

    Executorのフレームワークは、それはまた、スレッドファクトリを提供だけでなく、管理スレッド・プールを備えてキューとその並行プログラミングを容易にすることを、政策を否定します。

    使用Executorの模式的枠組み

    1. メインスレッドは、最初のタスク・オブジェクトその実装のRunnableまたは呼び出し可能インタフェースを作成する必要があります。

    2. オブジェクトが実装直接完全ExecutorServiceの実行の作成にRunnableを/呼び出し可能インターフェース:

      ExecutorServiceの。(実行のRunnable コマンド)或者ExecutorServiceのを。sumbit(Runnableをコマンド)或ExecutorServiceの。sumbit(呼び出し可能< T > タスク)。
    3. あなたはExecutorService.submit(...)を行う場合は、ExecutorServiceのは、未来のオブジェクト実装するインターフェイスを返します。最後に、メインスレッドは、タスク実行の完了を待つFutureTask.get()メソッドを実行することができます。メインスレッドは、ミッションの実行をキャンセルするFutureTask.cancel()を実行することができます。

    輸入java.util.concurrent.ArrayBlockingQueue;
    輸入java.util.concurrent.ThreadPoolExecutor;
    輸入java.util.concurrent.TimeUnit。
    
    パブリック クラスThreadPoolExecutorDemo { 
    
        プライベート 静的 最終 int型の CORE_POOL_SIZE = 5 ;
        プライベート 静的 最終 int型の MAX_POOL_SIZE = 10 ;
        プライベート 静的 最終 int型の QUEUE_CAPACITY = 100 ;
        プライベート 静的 最終長いKEEP_ALIVE_TIME = 1L ; 
    
        公共の 静的な 無効メイン(文字列[]引数){
            ThreadPoolExecutorキュータ = 新しいThreadPoolExecutor(
                    CORE_POOL_SIZE、
                    MAX_POOL_SIZE、
                    KEEP_ALIVE_TIME、
                    TimeUnit.SECONDS、
                    新しい ArrayBlockingQueue <> (QUEUE_CAPACITY)、
                     新しいThreadPoolExecutor.CallerRunsPolicy())。
    
            // 执行线程代码
    
            executor.shutdown(); 
    
        } 
    
    }
     

    CORE_POOL_SIZE:スレッドのコア数は、同時に実行できるスレッドの最小数を定義しました。

    MAX_POOL_SIZE:同時に実行できるスレッドの現在の数の能力に到達するためにキューに格納されているタスクキューは、スレッドの最大数になります。

    QUEUE_CAPACITY:新しいタスクがスレッドの数に加算される第一達した場合、コアは現在、スレッドを実行しているかどうかを決定する、タスクがキューに格納されます。

    KEEP_ALIVE_TIME:プール内のスレッドの数はスレッドのコア数よりも大きい場合、その後、新たなジョブの投入であれば、コアスレッドスレッドはすぐに破壊されない外ではなく、待ち時間が超過するまで待機しますKEEP_ALIVE_TIMEが破壊されリサイクルされますが。

    ThreadPoolExecutor.CallerRunsPolicy():executeメソッドの実行(ラン)の呼び出し元のスレッドに直接ある独自のスレッド実行中のタスクを、実行する呼び出しはexecutorがシャットダウンされた場合、タスクは破棄され、タスクを拒否しました。したがって、この戦略は、プログラムの全体的なパフォーマンスに影響を与える、新しいタスクの提出率が低下します。また、のようなこの戦略は、キューの容量を増加させます。この作業に耐えることができ、アプリケーションが遅延し、タスク要求をドロップすることができない場合は、この戦略を選択することができます。

     

    分析原理スレッドプール

     

    三つのスレッドプールサイズの決意

    かなり広い使用して簡単な式があります:

    • :CPU集約型のタスク(N + 1)のスレッド時折不足を防ぐために、これがメインタスクがCPUリソースを消費している、スレッドの数がNに設定することができます(CPUコア)+1、一つのスレッドよりもCPUコアの増刊改ページ、または他の原因タスクポーズ影響をもたらしました。タスクが停止されると、CPUはアイドル状態になりますが、この場合にはより多くのアウトスレッドのは、CPUのアイドル時間を最大限に活用することができます。

    • I / O集中型(2N):このアプリケーションタスク一緒に、システムがI / Oの相互作用を処理するために使用されているほとんどの時間、およびプロセス内のスレッドのI / Oは、一定の期間であるが、それはあなたができる、その後、ハンドルにCPUを占有しません。 CPUは、他のスレッドに引き渡すます。そのため、アプリケーションのI / O集中型のタスクは、いくつかのスレッドが複数設定することができ、具体的な計算党は2Nです。

おすすめ

転載: www.cnblogs.com/allenhhw/p/12101431.html