线程池原理

一、线程池优势:

        1.降低资源消耗,通过反复利用已创建线程降低线程创建和销毁造成的消耗;

      2.提高响应速度,当任务到达时,任务可以不需要等到线程的创建就能立即执行;

  3.提高线程的可管理性;

二、线程池原理:

当提交一个任务时候,线程池处理的这么一个流程:

文字描述: 

    1.线程池判断核心线程池是否都在执行任务,如果都在执行任务的时候则进行下一环节,如果没有的话,则创建新的工作线程来执行任务;

    2.线程池在检测任务队列是否已满,如果没满,则将新提交的任务,放在队列里面,否则进行下一环节;

    3.线程池检测线程池,是否都在执行任务中,如果没有则创建新的工作线程来执行任务,否则就会把当前提交的任务利用“饱和机制"进行处理操作;

      当TreadPoolExecutor  execute 分为下面4种情况

   1.如果当前的运行的线程数小于corePoolSize,则创建新的线程来执行任务(注意,创建新的线程要获取全局锁);

   2.如果当前的运行的线程数等于或大于corePoolSize,则把任务放到队列中BlockingQueue;(这个不需要获取全局锁)

   3.如果BlockingQueue队列已经满了,则就会在maximumPoolSize中创建新的线程;

   4.如果当前的线程数等于或者大于maximumPoolSize,任务将被拒绝,然后调用“饱和策略机制”,RejectedExecutionHandler.rejectedExecution;

三、线程池的使用:

      我们通过ThreadPoolExecutor 来创建线程池:

       new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,milliseconds,runnableTaskQueue,handler);

       corePoolSize:基本大小的线程池,如果当前线程数量大于核心线程池则不会创建线程;

       maximumPoolSize:线程池最大数量,如果队列满了,并且当前线程数量小于最大线程池的数量,则创建新的线程;

       keepAliveTime:线程的活动保持时间,如果任务很多并且每个任务保持的时间很短,所以尽可能增大线程活动保持时间,提高性能;

       TimeUnit:线程活动保持时间的单位

        runnableTaskQueue:任务队列用于保存等待执行的任务队列的阻塞队列:

         ArrayBlockingQueue:基于数组阻塞队列;

         LinkedBloackingQueue:基于链表结构的阻塞队列 吞吐量要比数组的要高;

        RejctedExceptionHandler(饱和策略):当队列和线程池都满了之后,则必须采用一种策略处理提交新任务;

        有四种策略:

       1.直接抛异常

       2.只有调用者所在的线程来调用任务

       3.丢弃队列里面最近的一个任务,并执行当前任务;

      4.不处理,不丢弃

四、向线程池提交任务:

    execute()和submit来进行提交任务

     

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值