一.线程池状态
- 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 版权协议,转载请附上原文出处链接和本声明。