为啥要用线程池呢?因为对象的创建、销毁是比较占用资源的,用线程池能够复用线程,而不是重新创建线程。使用线程池还有以下优点 :可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞;供定时执行、定期执行、单线程、并发数控制等功能.
java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。同时java也提供了一个专门管理ExecutorService的工具类:Execuators,用来创建和管理线程池。Executor框架提供了4种线程池:
1.newCachedThreadPool
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。
2.newFixedThreadPool
创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
3.newScheduledThreadPool
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
4.newSingleThreadExecutor
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。