1、执行器
1.1、为什么使用线程池
构建一个新的线程有一定的代价,因为涉及操作系统的交互。如果程序中创建大量的声明很短的线程,应该使用线程池(Thread pool),
另一个使用线程池的理由是减少并发线程的数目。创建大量线程会大大降低性能甚至使得虚拟机崩溃。
如果有一个会创建许多线程的算法,应该使用一个线程数“固定的”线程池以限制并发线程的总数
1.2、如何使用线程池
执行器类有许多静态工作方法来创建线程池
newCachedThreadPool
方法构建一个线程池,对于每个任务,如果有空闲线程可以使用,立即让它执行任务,如果没有可用的空闲线程,则创建一个线程。newFixedThreadPool
方法构建一个具有固定大小的线程池;如果提交的任务树多余空闲的线程数,那么得不到服务任务放置到队列中。当其他任务完成以后再运行它们,newSingleThreadExecutor
是一个退化了大小为1的线程池:由一个线程执行提交的任务,一个接着一个
这3个方法返回实现了ExecutorService
接口的ThreadPoolExecutor
类的对象
可用下面的方法之一将一个 Runnable
对象或 Callable
对象提交给 ExecutorService
:
Future<?> submit(Runnable task)
Future<T> submit(Runnable task, T result)
Future<T> submit(Callable<T> task)
当用完一个线程池的时候, 调用 shutdown
。该方法启动该池的关闭序列。被关闭的行器不再接受新的任务。当所有任务都完成以后,线程池中的线程死亡。另一种方法是调用shutdownNow
。该池取消尚未开始的所有任务并试图中断正在运行的线程