1、Executors常用的机种方法
/**
* 创建一个包含指定数目线程的线程池
* 如果任务书比线程数多,那么没有执行的任务必须等待,直到有任务完成并释放线程
* 如果线程池中的某个线程由于异常而结束时,线程池就会再补充一条新线程。
*
* todo 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。
*/
private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
/**
* 创建单一线程池,此线程池只有一个线程,可以实现意队列的方式来执行任务,
* 当线程销毁后,会自动创建一个线程继续执行任务
*
* todo 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。
*/
private static ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
/**
* 创建无界限线(可缓存的)程池,可以进行线程自动回收,此线程池存放点的线程个数理论值为 Integer,MAX_VALUE 最大值
* 如果线程池中的线程在60秒未被使用就将被移除
* 在执行新的任务时,当线程池中有之前创建的可用线程就重用可用线程,否则就新建一条线程
*
* todo 主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。
*/
private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
/**
* ScheduledExecutorService extends ExecutorService
* 创建一个可延迟执行或定期执行的线程池
*
* todo 主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。
*/
private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
2、开启线程池
(1)submit 和 execute 的区别
executorService.submit((Runnable) () ->{......});
executorService.execute((Runnable) () -> {......});
a. 接收的参数不一样,submit 可接收 callback 有几个重载方法
b.submit 有返回值,execute 没有返回值
(2)shutdown 和 shutdownNow
a.shutdown
按过去执行已提交任务的顺序发起一个有序的关闭,但是不接受新任务
如果已经关闭,则调用没有其他作用
b.List<Runnable> shutdownNow()
尝试停止所有的活动执行任务、暂停等待任务的处理,并返回等待执行的任务列表
在从此方法返回的任务队列中排空(移除)这些任务。 并不保证能够停止正在处理的活动执行任务
但是会尽力尝试。 此实现通过 Thread.interrupt() 取消任务
所以无法响应中断的任何任务可能永远无法终止