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. 周期性重复执行任务。
