Javaスレッドプールの使用

2215 ワード

マルチスレッドプログラミングでスレッドプールを作成する場合、Executors.newFixedThreadPool(8)方式でスレッドプールを作成することは一般的に禁止されています.これは怠け者の行為です.一般的な使用

new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)


この方法で作成します.
コンストラクション関数に入力されるパラメータは、スレッドプールの効率に直接影響するため、これらのパラメータの意味を知る必要があります.
  • corePoolSize:allowCoreThreadTimeOuttrueに設定されていない限り、スレッドプールが維持するスレッドの数.
  • maximumPoolSize:スレッドプールで許容される最大スレッド数
  • keepAliveTime:現在のスレッド数はcorePoolSizeより大きく、余分な空きスレッドの生存時間は
  • である.
  • unit:keepAliveTimeパラメータの時間単位
  • workQueue:タスクキュー
  • threadFactory:スレッド作成ファクトリ
  • handler:タスクキューがいっぱいで、ブロックされたときに新しいタスクを拒否するポリシー
  • 上の解釈はJDKの注釈で、書いてあるのも雲の中で霧の中で、以下は一つ一つ説明します.
    corePoolSize
    スレッドプールのデフォルト初期化では、allowCoreThreadTimeOutfalse、つまりデフォルトでは、スレッドプールのスレッド数は最小corePoolSizeであり、これらのスレッドがアイドルであってもcorePoolSizeの数は維持されます.スレッドプールオブジェクトには、allowCoreThreadTimeOut(boolean value)が入力されると、コアスレッドプールを表すスレッドがタスクが到着しない場合、true時間後に閉じる方法がある.
    maximumPoolSize keepAliveTimeは、スレッドプールの最大スレッド数を表します.スレッドプールの数がmaximumPoolSizeに達し、タスクキューがいっぱいになった場合、corePoolSizeに達するまで新しいスレッドが作成されます.ただし、maximumPoolSizeが無境界キューに送信されると、workQueueパラメータは機能せず、スレッドプールの最大数はmaximumPoolSizeになります.
    workQueue corePoolSizeパラメータは、有界キュー(例えばworkQueue)と無界キュー(例えばArrayBlockingQueue)に分けられ、無界キューに入るとLinkedBlockingQueueパラメータは機能しません.
    handler
    拒否ポリシーを設定します.拒否ポリシーは次のとおりです.
  • AbortPolicyは新しいタスクを直接拒否し、maximumPoolSize異常
  • を投げ出した.
  • CallerRunsPolicyは、現在のスレッドのRejectedExecutionExceptionメソッドで拒否されたタスクを実行し、エフェクタが閉じるとタスク
  • を破棄する.
  • DiscardPolicy新規タスク
  • を黙々と破棄
  • DiscardOldestPolicy最も古い未実行のタスクを破棄し、現在のタスク
  • を実行
    スレッドプールが初期化されると、プールにはスレッドがありません.
    では、executeはどのくらいの大きさに配置すればいいのでしょうか.一般に,CPU密集型タスクはスレッド数を少なく設定でき,機器のcpuコア数に相当する.IO密集型の場合、ほとんどのスレッドがブロックされるため、マルチ構成スレッド数、2*cpuコア数が必要