/**
* FixedThreadPool:
* 适合用在稳定且固定的并发场景
* 这种线程池不会拒绝任务,而且不会开辟新的线程,也不会因为线程的长时间不使用而销毁线程
* executorService.execute(runable);
*/
/**
* CacheThreadPool:
* 适合处理执行时间比较小的任务
* 线程空闲时间超过60s就会被杀死,所以长时间处于空闲状态的时候,这种线程池几乎不占用资源
* 阻塞队列没有存储空间,只要请求到来,就必须找到一条空闲线程去处理这个请求,找不到则在线程池新开辟一条线程
* 如果主线程提交任务的速度远远大于CachedThreadPool的处理速度,
* 则CachedThreadPool会不断地创建新线程来执行任务,这样有可能会导致系统耗尽CPU和内存资源,
* 所以在使用该线程池是,一定要注意控制并发的任务数,否则创建大量的线程可能导致严重的性能问题
* executorService.execute(runable);
*/
/**
* SingleThreadPool:
* 当线程运行时抛出异常的时候会有新的线程加入线程池替他完成接下来的任务
* 保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行,所以这个比较适合那些需要按序执行任务的场景
* 日志记录一般情况会比较慢(数据量大一般可能不写入数据库),顺序执行会拖慢整个接口,堆积更多请求,还可能会对数据库造成影响(事务在开启中),
* 所以日志记录完全可以扔到单线程的线程中去,一条条的处理
* executorService.execute(runable);
*/
/**
* ScheduleThreadPool:
* 固定线程数量,与FixedThreadPool不同的是:
* 它可以执行延时任务,也可以执行带有返回值的任务
* scheduledExecutorService.schedule(runable,5L,TimeUnit.SECONDS);
* scheduledExecutorService.submit(futureTask);
*/