线程池原理

    xiaoxiao2024-12-07  4

    一、线程池优势:

            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来进行提交任务

         

                

    转载请注明原文地址: https://ju.6miu.com/read-1294342.html
    最新回复(0)