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