ThreadPoolExecutorプール=て、新しいThreadPoolExecutor(スレッドの1 //コア数
、3 @スレッドの最大数
、60スレッド生存時間@
、TimeUnit.SECONDS、
<>(2)//有界キューに新しい新規ArrayBlockingQueue
、新しいThreadFactory新しいです(){
@オーバーライド
公共newthreadにスレッド(RunnableをR&LT){
スレッド新しい新TH =スレッド(R&LT、 "my_threadを");
IF(th.getPriority()= Thread.NORM_PRIORITY!){
th.setPriority(Thread.NORM_PRIORITY);
}
(TH IF。 isDaemon()){
th.setDaemon(falseに)。
}
戻り値TH;
}
}、新しい新規のRejectedExecutionHandler(){
@Override
公共ボイドrejectedExecution(R&Runnableを、ThreadPoolExecutor執行LT){
System.err.printlnを( "現在のタスクが拒否されました:" + R&LT);
}
})。
タスクT1は、新しいタスク(1,1)=。
タスクT2は、新たなタスク(2,2)=。
タスクT3は、新しいタスク(3,3)=。
タスクT4は新しいタスク(4,4)=。
タスクT5は新しいタスク(5,5)=。
タスクT6は、新しいタスク(6,6)=。
pool.execute(T1)。
pool.execute(T2)。
pool.execute(T3)。
pool.execute(T4)。
pool.execute(T5)。
pool.execute(T6)。
pool.shutdown();
パブリッククラスタスクを実装したRunnable {
プライベートint型のID。
プライベートint型の数;
公共のタスク(int型のID、int型のカウント数){
スーパー();
this.id = ID。
this.count =数えます。
}
@Override
ます。public void RUN(){
System.err.println( "スレッド処理タスク:" + this.id);
試み{
のThread.sleep(3000);
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}
@Override
パブリック文字列のtoString(){
リターン"タスク[ID =" + ID + + +カウント"カウント=" "]"。
}
}
業績コードの観点から
:タスクスレッド処理
の処理スレッドタスク:5
の処理スレッドのタスク:4
現在のタスクが拒否されました:タスク[ID = 6は、カウントを = 6]
の処理スレッドタスク:2
処理スレッドタスク:3
実行スレッドT1は直接コアスレッドの初期化を使用してタスクを実行する場合
実行スレッドT2が、その場合、スレッドの数がコア糸よりも大きい場合、スレッドは、T2キューを話す囲まれています
実行時間t3のとき、スレッド、スレッドの数がコア糸よりも大きい場合、スレッドは有界T3キューであります
キューがいっぱいになった場合には、実行T4のスレッドは、この時点でのスレッド数が最大スレッドを超えない場合は、新しいスレッドがタスクを実行するために有効になっています
キューがいっぱいになった場合には実行スレッドT5が、この時点でのスレッド数が最大スレッドを超えない場合は、新しいスレッドがタスクを実行するために有効になっています
キューが満杯である場合に実行T6のスレッドは、この時点でスレッドのスレッドの最大数を超えた場合、その拒否ポリシーを有効
ArrayBlockingQueueがキューを有界ならば、キューLinkedBlockingQueueが無制限のスレッドプールの動作に置き換えられ、ことに注意してください
スレッドの数は、カーネルスレッドの数を超えない場合には、それは無制限のキューが実行されるのを待っているに直接追加され、スレッドの数は、カーネルスレッドの数よりも大きい場合には、タスクを実行するスレッドを可能にするために、あなたのセット後の最大スレッド数には、実際にはありませんの役割