1. 程式人生 > 其它 >執行緒池,3大方法,7大引數,4種拒絕策略

執行緒池,3大方法,7大引數,4種拒絕策略

執行緒池的技術:

事先準備好一些資源,有人要用就來拿,用完記得還(關閉池)

執行緒池的好處

  1. 減少資源的消耗
  2. 提高系統的效能,提高相應速度(因為池的開啟和關閉非常消耗資源)
  3. 易於一起管理執行緒

總結:執行緒池的優點:執行緒複用,可以控制最大併發數,管理執行緒

三大方法


    public static void main(String[] args) {
        //ExecutorService ThreadPool = Executors.newSingleThreadExecutor();//單個執行緒啟動
        //ExecutorService ThreadPool = Executors.newFixedThreadPool(9);//自定義執行緒的大小
        ExecutorService ThreadPool = Executors.newCachedThreadPool();//根據執行的任務,可伸縮建立執行緒大小,任務越重,執行緒就越多,任務越輕,執行緒越少
        try {
            for (int i = 0; i < 10; i++) {
                ThreadPool.execute(()->{
                System.out.println(Thread.currentThread().getName()+"");
                });
            }
        } finally {
            ThreadPool.shutdown();//用完就要關閉執行緒池
        }
    }

七大引數

ThreadPoolExecutor(int corePoolSize,//主要執行緒大小
int maximumPoolSize,//最大執行緒大小
long keepAliveTime,//存在時間,沒有執行緒使用這個執行緒池,超過這個時間就會銷燬池
TimeUnit unit,//時間單位
BlockingQueue<Runnable> workQueue//阻塞佇列
ThreadFactory threadFactory,//執行緒工廠,一般是預設的,固定的
RejectedExecutionHandler handler//拒絕策略(有四種)
)

我們自定義一個執行緒池,來說明七大引數

package com.luoKing.ThreadPool;

import java.util.concurrent.*;

public class poolMothed {

    public static void main(String[] args) {
        ThreadPoolExecutor ThreadPool= new ThreadPoolExecutor(2,
                5,
                3,
                TimeUnit.DAYS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());



        try {
            for (int i = 0; i < 10; i++) {
                ThreadPool.execute(()->{
                System.out.println(Thread.currentThread().getName()+"");
                });
            }
        } finally {
            ThreadPool.shutdown();//用完就要關閉執行緒池
        }
    }
}

四大拒絕策略

/*
*
* new ThreadPoolExecutor.AbortPolicy()//超過執行緒池最大容量(MAXPool+capacity),就會丟擲異常
*new ThreadPoolExecutor.CallerRunsPolicy()//當超過最大容量時,還有執行緒進入,那麼就會返回到原來的地方(從哪來就返回到哪裡去)
*new ThreadPoolExecutor.DiscardPolicy()//會直接丟棄執行緒,不處理
* new ThreadPoolExecutor.DiscardOldestPolicy()//等待最早的執行緒,如果最早的執行緒處理完,就接受該執行緒,否則丟棄
* */