ThreadPoolExecutor api详解
阅读原文时间:2021年04月20日阅读:1

今天时间学习ThreadPoolExecutor api,该类是JUC原子包中的类,通过单元测试代码把所有public api方法跑了一遍,大致了解了底层实现,初学乍练,有很多一知半解的地方,待后续有了深入理解再来补充

package test.java.util.concurrent;


import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

/**
 * ThreadPoolExecutor的测试类
 *
 * @date 2020-07-28 23:03:01
 */
public class ThreadPoolExecutorTest {
        /**
        * corePoolSize 线程池大小
         * maximumPoolSize 最大线程池大小
         * keepAliveTime 线程存活时间
         * TimeUnit unit 时间单位
         * BlockingQueue<Runnable> workQueue 工作队列
        * @Param
        */
        @Test
        public void testConstruct0()throws Exception{
        ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3, TimeUnit.SECONDS,new LinkedBlockingDeque<>());
                testObj.execute(()-> System.out.println(23));
        }
        /**
         * corePoolSize 线程池大小
         * maximumPoolSize 最大线程池大小
         * keepAliveTime 线程存活时间
         * TimeUnit unit 时间单位
         * BlockingQueue<Runnable> workQueue 工作队列
         * threadFactory 线程创建工厂
         * @Param
         */
        @Test
        public void testConstruct1()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory());
                testObj.execute(()-> System.out.println(23));
        }
        /**
         * corePoolSize 线程池大小
         * maximumPoolSize 最大线程池大小
         * keepAliveTime 线程存活时间
         * TimeUnit unit 时间单位
         * BlockingQueue<Runnable> workQueue 工作队列
         * RejectedExecutionHandler 线程池拒绝策略
         * @Param
         */
        @Test
        public void testConstruct2()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
        }
        /**
         * corePoolSize 线程池大小
         * maximumPoolSize 最大线程池大小
         * keepAliveTime 线程存活时间
         * TimeUnit unit 时间单位
         * BlockingQueue<Runnable> workQueue 工作队列
         * threadFactory 线程创建工厂
         * RejectedExecutionHandler 线程池拒绝策略
         * @Param
         */
        @Test
        public void testConstruct3()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
        }
        /**
         * 执行任务
         * @Param
         */
        @Test
        public void testExecute()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
        }
        /**
         * 设置线程池状态为shutdown
         * @Param
         */
        @Test
        public void testShutdown()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                testObj.shutdown();
        }
        /**
         *设置线程池状态为terminated
         * @Param
         */
        @Test
        public void testShutdownNow()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.shutdownNow();
                testObj.execute(()-> System.out.println(23));

        }
        /**
         * 线程池是否关闭状态
         * @Param
         */
        @Test
        public void testIsShutdown()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.isShutdown());
        }
        /**
         *线程池是否正在终止状态
         * @Param
         */
        @Test
        public void testIsTerminating()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.isTerminating());
        }
        /**
         *线程池是否终止状态
         * @Param
         */
        @Test
        public void testIsTerminated()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.isTerminated());
        }
        /**
         * 等待指定时间后终止
         * @Param
         */
        @Test
        public void testAwaitTermination()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.awaitTermination(3,TimeUnit.SECONDS));
        }
        /**
         * 设置线程创建工厂
         * @Param
         */
        @Test
        public void testSetThreadFactory()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setThreadFactory(Executors.defaultThreadFactory());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.awaitTermination(3,TimeUnit.SECONDS));
        }
        /**
         *获取线程创建工厂
         * @Param
         */
        @Test
        public void testGetThreadFactory()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.getThreadFactory());
        }
        /**
         * 设置拒绝策略
         * @Param
         */
        @Test
        public void testSetRejectedExecutionHandler()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.getThreadFactory());
        }
        /**
         *获取拒绝策略
         * @Param
         */
        @Test
        public void testGetRejectedExecutionHandler()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.getRejectedExecutionHandler());
        }
        /**
         * 设置核心线程池大小
         * @Param
         */
        @Test
        public void testSetCorePoolSize()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setCorePoolSize(3);

        }
        /**
         *获取核心线程池大小
         * @Param
         */
        @Test
        public void testGetCorePoolSize()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getCorePoolSize());
        }
        /**
         * 预启动一个核心线程,返回启动的线程数
         * @Param
         */
        @Test
        public void testPrestartCoreThread()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.prestartCoreThread());
        }
        /**
         *预启动所有核心线程,返回启动的线程数
         * @Param
         */
        @Test
        public void testPrestartAllCoreThreads()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.prestartAllCoreThreads());
        }
        /**
         * 查看是否允许线程超时
         * @Param
         */
        @Test
        public void testAllowsCoreThreadTimeOut()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                System.out.println(testObj.allowsCoreThreadTimeOut());
        }
        /**
         * 设置允许线程超时
         * @Param
         */
        @Test
        public void testAllowCoreThreadTimeOut()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.execute(()-> System.out.println(23));
                testObj.allowCoreThreadTimeOut(true);
        }
        /**
         * 设置允许最大线程池大小
         * @Param
         */
        @Test
        public void testSetMaximumPoolSize()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setMaximumPoolSize(3);
        }
        /**
         *获取允许最大线程池大小
         * @Param
         */
        @Test
        public void testGetMaximumPoolSize()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getMaximumPoolSize());
        }
        /**
         * 设置线程存活时间
         * @Param
         */
        @Test
        public void testSetKeepAliveTime()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.setKeepAliveTime(3,TimeUnit.SECONDS);
        }
        /**
         *获取线程存活时间
         * @Param
         */
        @Test
        public void testGetKeepAliveTime()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getKeepAliveTime(TimeUnit.SECONDS));
        }
        /**
         * 获取工作队列
         * @Param
         */
        @Test
        public void testGetQueue()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getQueue());
        }
        /**
         * 移除任务
         * @Param
         */
        @Test
        public void testRemove()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.remove(()-> System.out.println());
        }
        /**
         * 情况队列
         * @Param
         */
        @Test
        public void testPurge()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                testObj.purge();
        }
        /**
         * 获取工作队列大小
         * @Param
         */
        @Test
        public void testGetPoolSize()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getPoolSize());
        }
        /**
         * 获取存活的线程数量
         * @Param
         */
        @Test
        public void testGetActiveCount()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getActiveCount());
        }
        /**
         * 获取最大线程池大小
         * @Param
         */
        @Test
        public void testGetLargestPoolSize()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getLargestPoolSize());
        }
        /**
         * 获取任务数量
         * @Param
         */
        @Test
        public void testGetTaskCount()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getTaskCount());
        }
        /**
         *获取完成的任务数量
         * @Param
         */
        @Test
        public void testGetCompletedTaskCount()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.getCompletedTaskCount());
        }
        /**
         *toString
         * @Param
         */
        @Test
        public void testToString()throws Exception{
                ThreadPoolExecutor testObj=new ThreadPoolExecutor(3,3,3,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
                System.out.println(testObj.toString());
        }
}