一、初始化一个线程池
基于ThreadPoolExecutor类初始化一个指定线程数的线程池线程池
二、提交任务
有两种提交任务的方式:Executor.execute()
和ExecutorService.submit()
通过Executor.execute()
方法提交的任务,必须实现Runnable接口,该方式提交的任务不能获取返回值,因此无法判断任务是否执行成功。
通过ExecutorService.submit()
方法提交的任务,可以获取任务执行完的返回值。
三、执行任务
execute
实现的执行流程:
先查看当前运行状态,如果不是RUNNING 状态会拒绝执行任务,如果是RUNNING状态,就会查看当前运行的线程数量,如果小于核心线程数,会创建新的线程来执行这个任务,如果不小于核心线程,会将这个任务放到阻塞队列去等代执行,直到上一个任务执行完再来执行这个任务。如果失败会创建一个非核心线程来执行这个任务如果当前线程数大于最大线程数,会直接拒绝该任务.
submit
实现的执行流程:
这个方法也是用来向线程池提交任务的,但是它和execute()方法不同,它能够返回任务执行的结果,它实际上还是调用的execute()方法,只不过它利用了Future来获取任务执行结果。
关于ThreadPoolExecutor的文章可以看:
深入分析Java线程池的实现原理
Java线程池执行器ThreadPoolExecutor工作原理
Java并发编程:线程池的使用