首页 > 编程语言 > 详细

线程池

时间:2021-03-30 09:35:18      阅读:30      评论:0      收藏:0      [点我收藏+]
线程池
    1.重复使用线程执行任务,减少线程创建和销毁的消耗
    2.减少创建和销毁 提高了系统的效率
    3.综合管理线程
线程池执行过程
    包含:   1.核心线程池   未满-创建线程执行任务   满了交给阻塞队列
                  2.阻塞队列      未满 放入阻塞队列 满了 交给线程池
                  3.线程池          未满创建线程,满了交给线程池
                  4.饱和策略       
创建线程池
第一类:ThreadPoolExecutor  他的三个子类
        第一个不限制线程个数
ExecutorService executorService = Executors.newCachedThreadPool();
        newFixedThreadPool()与newCachedThreadPool()相比可以设置线程的个数。
ExecutorService executorService = Executors.newFixedThreadPool(3); 
        只有一个线程运行
ExecutorService executorService = Executors.newSingleThreadExecutor();
启动多线程
executorService.execute(new RuanAble接口实现类);
关闭线程池
executorService.shutDown();
 
第二类:ScheduledExecutorService
    只有一个线程运行
newSingleThreadScheduledExecutor
    多个线程运行
newThreadScheduledExecutor
第三类ForkJoinPool
核心是分而治之,一块蛋糕分成多份,然后去吃掉他
 
线程池的生命周期
运行状态  和  终止状态
运行状态进入终止状态会经过
        1.shutdown   不接受新的任务 但是会执行完阻塞队列中的任务
        2.stop            不接受新的任务,并终止处理中的任务
完成上面两种后都会进入 tidying状态
    有效线程数为0调用terminated()方法 进入终止状态
 
线程池的创建 第一类的线程池,都会调用一下的方法
public ThreadPoolExecutor(
int corePoolSize,            核心线程池个数
int maximumPoolSize,    线程池创建线程的最大个数
long keepAliveTime,        空闲线程的可存活的时间
TimeUnit unit,                时间单位TimeUnit.SECORD  以秒为单位
BlockingQueue<Runnable> workQueue,    阻塞队列
ThreadFactory threadFactory,    创建线程的工程类
RejectedExecutionHandler handler  饱和策略
) {
}
 
阻塞队列
1.ArrayBlockingQueue
        基于数组的阻塞队列的实现,在生产者和消费者中共用一个锁对象,无法并行运行
2.LinkedBlockingQueue
        基于链表实现,生产者与消费者分别采用独立的锁对象,可以并行运行
3.DelayQueue
        只会阻塞消费者 延迟队列
4.PriorityBlockingQueue
        只会阻塞消费者   直接输出对象可以得到 队列中的数据  队列中每次add都会加在队列最前面,每次take()方法都会减少一个数据  这个数据是后放先出
5.SynchronousQueue
        没有缓冲区 针对生产者与消费者的时候 那么就相当于 生产一个必须消费一个之后才能继续生产
 
 
饱和策略/拒绝策略
当任务超出线程的个数 ,即有100个任务,你只有30个线程,当第31个进来的时候会有下面的情况
1.AbortPolicy
    丢弃新的任务,并抛出异常RejectExecutionException
2.DiscardPolicy
    丢弃新的任务,但是不抛出异常
3.DiscardOldestPolicy
    丢弃最前面的任务,重新执行任务
4.CallerRunsPolicy
    调用线程处理
 
execute()方法
submite()方法
execute()需要的是Runable接口实现类
submit()可以是Runable接口实现类和Callable接口实现类
execute()没有返回值
submit()有返回值
 
 
 

线程池

原文:https://www.cnblogs.com/wxgShareBlog/p/14594694.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!