线程池:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源
合理利用线程池能够带来三个好处:
1、降低资源消耗,减少了创建和销毁线程的次数,每一个工作线程都可以被反复利用,可以执行多个任务
2、提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行
3、提高线程的可管理性。可以根据系统的承受能力,调整线程池中的工作线的数目,防止因为消耗过多的内存而把服务器累趴下(每个程序大约需要1mb内存,线程开的越多,消耗的内存也就越大,最后死机)
线程池:JDK1.5之后提供的
Java.util.concurrent.Executors:线程池的工厂类,用来生产线程 池
Executors类中的静态方法:static ExecutorsService newFixedThreadPool(int nThread)创建一个可重用固定线程池的线程池
参数:
int nThreads:创建线程池中的包含的线程数量
返回值:
ExecutorsService接口,返回的是 ExecutorsService接口的实现类对象,我们可以使用 ExecutorsService接口接收(面向接口编程)
Java.util.concurrent. ExecutorsService:线程池接口
用来从线程池中获取线程,调用start方法,执行线程任
submit(Runnable task)
提交一个Runnable 的任务执行,
关闭/销毁线程池的方法:
- void shutdown()
- 启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有额外的作用。
此方法不等待以前提交的任务完成执行。 使用
awaitTermination
来做到这一点
- 启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有额外的作用。
线程池的使用步骤:
1、使用线程池的工厂类Executors里边提供的静态方法newFixedPool生产一个指定线程数量的线程池
2、创建一个类,实现Runnable接口,重写run()方法,设置线程任务
3、调用ExecutorsService中的方法submit,传递线程任务(实现类),开启run方法
4、调用ExecutorsService中的方法shutdown()销毁线程池(不建议使用)