1、创建多线程的方式?
    2、线程池平常是怎么创建的?
    答案:
    java 创建线程的三种方式、创建线程池的四种方式
    https://blog.csdn.net/qq_35275233/article/details/87893337
    线程池:
    https://www.cnblogs.com/xiaoshen666/p/10869035.html
    基本概念:
    public ThreadPoolExecutor(int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
    Executors.defaultThreadFactory(), defaultHandler);
    1、ThreadPoolExecutor
    corePoolSize(线程池的基本大小)
    maximumPoolSize(线程池中线程最大大小):线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。
    keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。
    poolSize(线程池中当前线程的数量) : 线程池中当前线程的数量,当该值为0的时候,意味着没有任何线程,线程池会终止;同一时刻,poolSize不会超过maximumPoolSize。
    TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。
    新提交一个任务时的处理流程:
    1、如果线程池的当前大小还没有达到基本大小(poolSize < corePoolSize),那么就新增加一个线程处理新提交的任务;
    2、如果当前大小已经达到了基本大小,就将新提交的任务提交到阻塞队列排队,等候处理.workQueue.offer(command);
    3、如果工作队列已满,并且当前大小poolSize没有达到maximumPoolSize,那么就新增线程来处理任务;
    4、如果队列已满,并且当前线程数目也已经达到上限(maximumPoolSize),那么意味着线程池的处理能力已经达到了极限,此时需要拒绝新增加的任务。至于如何拒绝处理新增的任务,取决于线程池的拒绝策略RejectedExecutionHandler。
    2、ScheduledThreadPoolExecutor
    ScheduledThreadPoolExecutor用于定时任务,这里的定时意义在于:
    1. 指定延时后执行任务。
    2. 周期性重复执行任务。
    image.jpeg