Callable, Runnable, Futher, FutherTask:
Runnale:接口,里面有一个run方法,无返回值,代表一个任务。
Callable:接口,里面有一个带返回值的方法call,返回值为泛型T,也代表一个任务。
Futher:接口,里面有五个重要的方法,用来获取任务及其状态。
cancle(xxx):xxx是一个boolean类型的值,为true代表可以取消正在执行的任务。
isCancled():判断当前任务是否已经取消掉
isDone():判断当前任务是否已经做完
get() ,get(time ,Utile.time):获取任务返回值,未执行完任务时阻塞。带时间的表示等待指定时间后,如果还未执行完就不在等待获取结果了。
RunnaleFuther:继承了Runnale与Futher接口。
FutherTask:实现了RunnableTuther接口。 构造器需要一个Callable的实现类。 可以看出RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
Executer,ExecuterService,AbstractExecuterService,ThreadPoolExecuter:
Executer:顶级接口,声明了一个execute(Runnale)方法,用来提交任务。
ExecuterService:继承Executer接口,并添加了Futher submit(Runnable),Futher submit(Callable),shutdown()。
AbstractExecuterService:实现了ExecuterService接口,并实现了所有方法
ThreadPoolExecuter:继承了AbstractExecuterService。
几个重要的方法:
execute()
submit()
shutdown()
shutdownNow()
execute()方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。
submit()方法是在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的,但是它和execute()方法不同,它能够返回任务执行的结果,去看submit()方法的实现,会发现它实际上还是调用的execute()方法,只不过它利用了Future来获取任务执行结果