因为删除和新建线程都是费时的工作,所以可以使用线程池ExecutorService重用线程。把
要执行的任务放到线程池,让它自己调度这些任务。这些任务是轻量级线程。
有两种线程池,它们使用不同的方式创建。两种方式创建线程池。
int threads = 4; ExecutorService es = Executors.newFixedThreadPool(threads);
有大量任务要执行的线程池用newCachedThreadPool创建。
ExecutorService service = Executors.newCachedThreadPool();
创建一个可根据需要创建新线程的线程池,但是如果以前构造的线程可用时,就重用它们。
将长期不用的线程从线程池删除,也就是删除60秒内没有用过的线程。就好像超市收银柜台数
量是动态的,顾客多就多开几个,顾客少就少开几个收银柜台。
newFixedThreadPool用于少数几个长期运行的任务的线程池。
ExecutorService service = Executors.newFixedThreadPool(2);
newFixedThreadPool会重用已有的线程,但是不会创建新的线程。如果其中一个线程因为
错误而结束了,将会创建一个新的接替它执行后续的任务。就好像在球场上的篮球运动员数量
是固定的,如果有人受伤下场,就会有候补队员接替。
可以使用线程池执行一组任务,最简单的任务不返回值给主调线程。要返回值的任务可以
实现Callable<T>接口,线程池执行任务并通过Future<T>的实例获取返回值。
Callable是类似于Runnable的接口,在其中定义可以在线程池中执行的任务。Future表示
异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
Future的cancel方法表示取消任务的执行,cancel方法有一个布尔参数,当参数为true时,表
示立即中断任务的执行;当参数为false时,表示允许正在运行的任务运行完成。Future的get
方法表示等待计算完成,获取计算结果。