JAva同時プログラミングの芸術第9章-javaのスレッドプール
2424 ワード
1、スレッドプールの3つのメリット:リソース消費量を削減します.作成したスレッドを再利用することで、スレッドの作成/破棄にかかるコストを削減できます. は応答速度を向上させる. スレッドの管理性が向上します.統一的に分配し、最適化し、監視する.
2、スレッドプールの処理フロー
新しいタスクがスレッドプールにコミットされた後の処理プロセス: 1.コアスレッドプールが満たされているかどうか、満たされていない場合はスレッド実行タスクを作成し、満たされている場合は次のプロセス に進む.キューが満たされているか否かを判断する、満たされていない場合はタスクをキューに格納し、満たされている場合は次のフロー に進む. 3.スレッドプールが満たされているかどうかを判断し、満たされていない場合はスレッド実行タスクを作成し、満たされている場合はポリシーに従って実行できないタスクを処理します.
3、スレッドプールの使用
3.1、スレッドプールの作成 corePoolSize:スレッドプールの基本サイズ maximumPoolSize:スレッドプールの最大スレッド数 keepAliveTime:スレッドのアクティブな保持時間.スレッドがアイドル状態になると、生存時間が維持され、タスク量が大きく、タスクの実行時間が短いと、スレッドプールの生存時間を増大することができ、スレッドの利用率 を向上させることができる. TimeUnit:スレッドアクティビティ保持時間の単位 BlockingQueue:タスクを格納するためのブロックキュー.キューの選択はjavaのブロックキュー を参照することができる. ThreadFactory:スレッドを作成するファクトリを設定します. RejectedExecutionHandler:飽和戦略.つまり、スレッドとキューがいっぱいになった場合、新しいコミットされたタスクを処理するためにどのようなポリシーを取るべきか、デフォルトポリシーはAbortPolicy(例外を投げ出す)、その他のポリシーはCallerRunsPolicy(呼び出し元のスレッドのみでタスクを実行する)、DiscardOldestPolicy(キュー内の最近のタスクを破棄し、現在のタスクを実行する)、DiscardPolicy 3.2、スレッドプールにタスクを提出する
タスクをコミットするには、execute()とsubmit()の2つの方法があります.
execute()メソッドは、タスクがコミットされた後に値が返されない場合に適用されます.値が返されていないため、タスクがコミットされた後もタスクが正常に実行されたかどうかを判断できません.
submitメソッドは、タスクのコミット後に戻り値がある場合に適用され、future.get()メソッドで戻り値を取得できます.get()は、タスクが完了するまでスレッドをブロックします.
3.3、スレッドプールを閉じる
スレッドプールを閉じるには、shutdown()とshutdownNow()の2つの方法があります.これらの方法の原理は、スレッドプール内のすべてのスレッドを巡り、各スレッドプールのinterrupt()を呼び出すことです.スレッドを中断する方法です.ただし、shutdownNowでは、スレッドプールのステータスをSTOPに設定してから、タスクを実行中または一時停止しているすべてのスレッドを停止し、実行待ちタスクのリストに戻ります.shutdownでは、スレッドプールのステータスをSHUTDOWNステータスに設定し、タスクを実行していないすべてのスレッドを中断します.
3.4合理的なスレッドプールの配置
スレッドプール構成の解析角度タスクの性質:IO密集型かCPU密集型か、cup密集型は少し小さいスレッド数を配置することができ、io密集型は多くのスレッド数 を配置することができる.タスクの優先度:PriorityBlockingQueueで を処理できます.タスク処理時間の長さ タスクの依存性:たとえばデータベース接続 に依存するかどうか
スレッドプールのタスクキューの選択では、タスクが多すぎると、エラーキューを投げ出すことができ、キュー内のタスクがますます多くなり、メモリがいっぱいになり、システム全体が使用できなくなる可能性があります.
3.5、スレッドプールの監視
2、スレッドプールの処理フロー
新しいタスクがスレッドプールにコミットされた後の処理プロセス:
3、スレッドプールの使用
3.1、スレッドプールの作成
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
タスクをコミットするには、execute()とsubmit()の2つの方法があります.
execute()メソッドは、タスクがコミットされた後に値が返されない場合に適用されます.値が返されていないため、タスクがコミットされた後もタスクが正常に実行されたかどうかを判断できません.
submitメソッドは、タスクのコミット後に戻り値がある場合に適用され、future.get()メソッドで戻り値を取得できます.get()は、タスクが完了するまでスレッドをブロックします.
3.3、スレッドプールを閉じる
スレッドプールを閉じるには、shutdown()とshutdownNow()の2つの方法があります.これらの方法の原理は、スレッドプール内のすべてのスレッドを巡り、各スレッドプールのinterrupt()を呼び出すことです.スレッドを中断する方法です.ただし、shutdownNowでは、スレッドプールのステータスをSTOPに設定してから、タスクを実行中または一時停止しているすべてのスレッドを停止し、実行待ちタスクのリストに戻ります.shutdownでは、スレッドプールのステータスをSHUTDOWNステータスに設定し、タスクを実行していないすべてのスレッドを中断します.
3.4合理的なスレッドプールの配置
スレッドプール構成の解析角度
スレッドプールのタスクキューの選択では、タスクが多すぎると、エラーキューを投げ出すことができ、キュー内のタスクがますます多くなり、メモリがいっぱいになり、システム全体が使用できなくなる可能性があります.
3.5、スレッドプールの監視