线程池的执行任务的过程


在开发中我们会使用到线程,而为了减少资源的损耗,提高性能,我们一般会使用线程池。线程池具有重用存在的线程,减少对象创建、消亡的开销,性能佳, 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞,提供定时执行、定期执行、单线程、并发数控制等功能。那么线程池是怎么执行的呢,我们来分析一下:

要了解线程池的执行过程,我们需要知道线程池是怎么创建的,现在我们来说其中一种:

<ignore_js_op>
从上面的构造方法中可以看出,线程池的创建是定义了相关的概念的,那么线程池是如何提交任务的呢,当线程池创建完毕之后,要提交任务,需要调用它里面的excute方法进行提交:

[Java]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void execute(Runnable command) {
         if (command == null )
             throw new NullPointerException();
         int c = ctl.get();
         //当前线程池中线程比核心线程数少,新建线程执行任务
         if (workerCountOf(c) < corePoolSize) {
             if (addWorker(command, true ))
                 return ;
             c = ctl.get();
         }
         //当前线程池中核心线程池已满,但是任务队列未满,则添加到队列中
         if (isRunning(c) && workQueue.offer(command)) {
             int recheck = ctl.get();
             //如果被关闭则拒绝任务
             if (! isRunning(recheck) && remove(command))
                 reject(command);
             //如果之前的线程已被销毁则新建一个线程
             else if (workerCountOf(recheck) == 0 )
                 addWorker( null , false );
         }
         //当前线程池中核心线程池已满,队列已满,试着创建一个新线程
         else if (!addWorker(command, false ))
             //创建线程失败,说明线程池关闭或者完全满了,拒绝任务
             reject(command);
     }


可以看到,线程池处理一个任务主要分三步处理,代码注释里已经介绍了。现在我们使用图片来理解一下:
<ignore_js_op>
从图中我们可以看到,向线程池提交任务时,会首先判断线程池中的线程数是否大于设置的核心线程数,如果不大于,就创建一个核心线程来执行任务。
如果大于核心线程数,就会判断缓冲队列是否满了,如果没有满,则放入队列,等待线程空闲时执行任务。
如果队列已经满了,则判断是否达到了线程池设置的最大线程数,如果没有达到,就创建新线程来执行任务。
如果已经达到了最大线程数,则执行指定的拒绝策略。

更多java学习资料可关注:itheimaGZ获取


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM