Java线程池

ExecutorService线程池

线程池的作用
线程池作用就是限制系统中执行线程的数量。
     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,
多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队
列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务
需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要使用线程池
为什么要用线程池:
2. 每次使用new Thread().start()开启线程是非常消耗性能。
2.线程池减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器
累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个
执行线程的工具。真正的线程池接口是ExecutorService。
ExecutorService 真正的线程池接口
ScheduledExecutorService 能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。
ThreadPoolExecutor ExecutorService的默认实现。
ScheduledThreadPoolExecutor 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度类的实现

由于配置一个线程池是比较复杂的,尤其是在对线程池的原理还不是很清楚的情况下,很可能配置的线程不是最优的,所以Executors类里面提供了一些静态工厂,生成一些常用的线程池。

1. newSingleThreadExecutor() 
   创建一个单线程的线程池。这个线程池只有一个线程进行工作
2. newFixedThreadPool(int nThreads) 
   创建一个固定大小的线程池。 每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变。
3. newCachedThreadPool 
    创建一个可缓存的线程池。如果当前执行的线程数少于你创建该线程的线程数,那么此时就会回收部分空闲(60秒不执行任务)的线程,当任务增加时,此时该线程池不会对线程池大小做出限制,线程池大小完全依赖于JVM所能承受的线程大小
4. newScheduledThreadPool    
   创建一个大小无限的连接池,此线程池支持定时以及周期行执行任务的需求

ThreadPoolExecutor详解

构造方法: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 
- corePoolSize: 池中所保存的线程数,包括空闲线程
- maximumPoolSize: 池中允许的最大线程数
- keepAliveTime: 线程在终止之前可能保持空闲的时间限制。 如果存在超过当前在池中的线程核心数量,则在等待这段时间而不处理任务之后,多余的线程将被终止。
- unit: keepAliveTime参数的时间单位 
- workQueue: 在执行任务之前用于保存任务的队列。 该队列将仅保存execute方法提交的Runnable任务。
- threadFactory: 执行程序创建新线程时使用的工厂 
- RejectedExecutionHandler: 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
备注:TheadPoolExecutor时Executors类的底层实现。




你可能感兴趣的:(Java)