线程池的总结

【摘要】 一.线程池状态
1.RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。线程池的初始化状态是RUNNING。线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。2.SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。调用线程池的shutdown()方法时,线程池由RUNNING -> SHUTDOWN。3.STO…

一.线程池状态

  • 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 (this) { try { Thread.sleep(100); } 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的

文章来源: blog.csdn.net,作者:shmily&&ylimhs,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_46360888/article/details/115910519

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享