一部には、スレッドプールからの定義を理解します

    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が無制限のスレッドプールの動作に置き換えられ、ことに注意してください

スレッドの数は、カーネルスレッドの数を超えない場合には、それは無制限のキューが実行されるのを待っているに直接追加され、スレッドの数は、カーネルスレッドの数よりも大きい場合には、タスクを実行するスレッドを可能にするために、あなたのセット後の最大スレッド数には、実際にはありませんの役割

公開された20元の記事 ウォンの賞賛4 ビュー20000 +

おすすめ

転載: blog.csdn.net/lj872224/article/details/97882787