boy-learning-thread𞓜1.1.6スレッド池の原理

4179 ワード

関連ソース:boy-learning-thread個人ブログ:http://bruce.bugmakers.club 内容は「網易微専門-高性能プログラミング章節」から来ました.
スレッドの原理
1、なぜスレッド池を使いますか?
スレッドは多ければ多いほどいいですか?
1、スレッドはjavaの中で一つの対象であり、更にオペレーティングシステムの中の資源であり、スレッドの作成、廃棄には時間が必要である.「作成時間+廃棄時間」の実行時間が合わないと思います.
2、javaオブジェクトはヒープメモリを占有し、オペレーティングシステムのスレッドはシステムメモリを占有し、jvm規格によると、スレッドデフォルトの最大スタックサイズは1 Mで、この空間はシステムメモリから割り当てられる必要がある.スレッドが多すぎて、メモリがたくさん消費されます.
3、オペレーティングシステムは頻繁にスレッドのコンテキストを切り替える必要があります.(みんなが実行されたいです.)スレッドが多すぎると性能に影響します.
スレッドのリリースは、スレッドの数を簡単に制御するためです.
2、スレッド池の原理-概念
1、スレッド池マネージャ:スレッド池を作成して管理するためのもので、スレッド池の作成、スレッドの廃棄、新しいタスクの追加などがあります.
2、ワークスレッド:スレッド池のスレッドは、タスクがない時は待機状態にあり、ループしてタスクを実行できます.
3、タスクインターフェース:各タスクが必ず実行されるインターフェースは、ワークスレッドのスケジュールタスクの実行に向けて、主に規定されています.タスクの入り口、タスクの実行後の最後の作業、タスクの状態.
4、タスクのキュー:未処理のタスクを保存するために使用します.を選択します.
2.1、スレッド池API-インターフェース定義と実現類
タイプ
名前
説明
インターフェース
Exector
最上位インターフェースは、タスクを実行する方法を定義しています.
インターフェース
ExectorService
Exectorインターフェースを継承し、Callable、Future、クローズ方法を開拓しました.
インターフェース
ScheduledExect rService
ExectorServiceを継承し、タイミングタスクに関する方法を追加しました.
実装クラス
ThreadPool Exector
基礎、標準のスレッド池実現類
実装クラス
ScheduledThreadPoolExector
ThreadPool Exectorを継承し、ScheduledExectorServiceにおけるタイミング・タスクに関する方法を実現しました.
ScheduledThreadPoolExectorは最も豊富な実現類であると考えられます.
2.2、スレッド池API-方法定義
ExectorService
//    ExecutorService      ,          ,     ,          
awaitTermination(long timeout, TimeUnit unit);

//          ,     ,    
invokeAll(Collection extends Callable> tasks);

//          ,         ,    ,      
invokeAll(Collection extends Callable> tasks, long timeout, TimeUnit unit);

//          ,           ,    ,      
invokeAny(Collection extends Callable> tasks);

//          ,              ,    ,      
invokeAny(Collection extends Callable> tasks, long timeout, TimeUnit unit);

//        ,   treu
isShutdown();

//      ,           ,   true
isTerminated();

//        ,             ,        
shutdown();

//              ,         ,            
shutdownNow();

//           Callable     ,      Future   ,     Callable     
submit(Callable task);

//           ,      Future   ,      null
submit(Runnable task);

//           ,      Future   ,         result
sumit(Runnable task, T result);
ScheduledExect rService
//             ,           
schedule(Callable callable, long delay, TimeUnit unit);
schedule(Runnable command, long delay, TimeUnit unit);

//             ,            ,        ,        
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
scheduleWithFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit);
scheduleAtFixedRate方法は、一回のタスク実行時にサイクル時間を超えて、次回のタスクはこのタスクの実行後、直ちに実行します.schedualwithFixedDelay方法は、一回のタスクの実行時間がサイクル時間を超えています.次回のタスクはこのタスクの実行が終わった後、実行遅延を計算します.
2.3、スレッド池API-Exectorsツール類
自分でスレッドを実際に使うこともできます.また、Exectorsでスレッドを作成する工場類もあります.
1)newFixedThreadPool(int nThreads)
固定サイズ、タスクキューの境界がないスレッドを作成します.コアスレッド数=最大スレッド数.
2)newCachedThreadPool()
サイズが無限のキャッシュスレッドを作成します.彼の任務の隊列は同期隊列である.タスクはプールに追加され、プールに空きスレッドがある場合は、アイドルスレッドで実行し、無の場合は新しいスレッドを作成して実行し、プールのスレッドが60秒以上アイドル状態になり、廃棄されてリリースされます.スレッド数はタスクの多少によって変化します.タスクの量がコントロールできず、時間がかかる小さな非同期タスクを実行します.コアスレッド数=0、最大スレッド数=Integer.MAX_VALE
3)newSingleThreadExector()
非境界タスクキューを実行するスレッドは一つだけです.このスレッドプールでは、タスクは、列に参加する順に1回ずつ実行されます.一意のスレッドがタスク異常で終了すると、次のタスクを実行するために新しいスレッドを作成します.newFixedThreadPool(1)との違いは、単一スレッドプールの大きさがnew SingleThreadExector方法でハードエンコードされ、これ以上変更できないことである.
4)newScheduledThreadPool(int coree PoolSize)
タイミングでタスクを実行できるスレッド池.この池のコアスレッド数はパラメータで指定されています.最大スレッド数=Integer.MAX_VALE
3、スレッド池の原理-タスクexecuteプロセス
1、コアスレッド数に達していますか?達成されていません.作業スレッドを作成してタスクを実行します.
2、タスクのキューはいっぱいですか?満タンになっていない場合は、新たに提出したジョブをジョブキューに保存します.
3、スレッド池の最大数に達していますか?達成していない場合は、新しいワークスレッドを作成してタスクを実行します.
4、最後に、このタスクを処理するために拒否戦略を実行します.
4、スレッド数
スレッドの数はどうやって決めますか?
計算型タスク:cpuの数の1~2倍.
IOタイプのタスク:具体的なIOブロック時の進級テストによって決定します.
Tomcatのデフォルトのスレッド数は200です.
必要に応じて、スレッド数を最小数と最大数の間で自動的に増減させることも考えられる.
CPUの使用率を監視して、80%より遠くても使用が不合理で、大きいかどうかは分かりません.