线程池的总结

  • Post author:
  • Post category:其他





一.线程池状态

  • 1.RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。线程池的初始化状态是RUNNING。线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。
  • 2.SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。调用线程池的shutdown()方法时,线程池由RUNNING -> SHUTDOWN。
  • 3.STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。调用线程池的shutdownNow()方法时,线程池由(RUNNING or SHUTDOWN ) -> STOP。
  • 4.TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。因为terminated()在ThreadPoolExecutor类中是空的,所以用户想在线程池变为TIDYING时进行相应的处理;可以通过重载terminated()函数来实现。
  • 当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
  • 当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
  • 5.TERMINATED:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。



二.线程池核心参数

  • 1.核心线程数corePoolSize:表示常驻核心线程数量。
  • 2.最大线程数maximumPoolSize:表示线程池中能同时执行的最大线程数量。这个值必须大于等于corePoolSize,如果这两个值相等,那就是固定大小的线程池
  • 3.缓存队列Queue:缓存队列,当请求的线程数大于corePoolSize的时候,线程会进入队列进行阻塞。
  • 当这个队列达到上限之后,线程池会创建新的线程,直到maximumPoolSize大小位置
  • 4.拒绝策略RejectedExecutionHandler:

    • 4.1.AbortPolicy(默认) 丢弃这个任务并抛出 RejectedExecutionException异常
    • 4.2 DiscardPolicy 丢弃掉这个任务,但是不抛出异常
    • 4.3.DiscardOldestPolicy 抛弃掉在队列中等待最久的任务,然后把当前任务加入队列中
    • 4.4 CallerRunsPolicy 调用任务的run()方法绕过线程池直接执行
  • 5.线程工厂threadFactory:用来生产一组相同任务的线程
  • 6.超时时间keepAliveTime:表示线程池中除常驻核心线程之外的其他线程的空闲时间,如果超过这个时间就会销毁



3.线程池的种类有5种

3.1.可缓存线程池CachedThreadPool

3.2指定工作线程数的线程池.FixedThreadPool

3.3.只创建唯一的工作者线程来执行任务SingleThreadExecutor

3.4.定长的线程池,支持定时及周期性任务执行ScheduledThreadPool

3.5.单线程,定期地执行

具体代码如下SingleThreadScheduledExecutor

public class MyThread3 {

    public static void main(String[] args) {
        //可缓存线程池 false表示不是守护进程
        ExecutorService executorService = Executors.newCachedThreadPool(new TaskThreadFactory("a",false,1));
        executorService.execute(new MyRunnable());
        //创建一个指定工作线程数量的线程池
        ExecutorService executorService1 = Executors.newFixedThreadPool(10);
        executorService1.execute(new MyRunnable());
        //创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务
        ExecutorService executorService2 = Executors.newSingleThreadExecutor();
        executorService2.execute(new MyRunnable());
        //创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行
        ExecutorService executorService3 = Executors.newScheduledThreadPool(10);
        executorService3.execute(new MyRunnable());
        //创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行
        ExecutorService executorService4 = Executors.newSingleThreadScheduledExecutor();
        executorService4.execute(new MyRunnable());
    }
    static class MyRunnable implements Runnable{
        public static int i = 100;
        @Override
        public void run() {
            while (true) {
                synchronized (MyRunnable.class) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (i <= 0) {
                        break;
                    }
                    System.out.println(Thread.currentThread().getName() + "----------" + (i--) + "张票");
                }
            }
        }
    }
}



4.线程池的创建方式


4.1.通过exectors类创建



4.2.通过ThreadPoolExecutor类创建


注:exectors是底层是调用ThreadPoolExecutor的



版权声明:本文为m0_46360888原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。