专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java线程池学习教程:实现简易线程池!

Java线程池学习教程:实现简易线程池!

更新时间:2020-02-27 11:06:34 来源:星辉 浏览2651次


  开发中经常会遇到各种池(如:连接池,线程池),它们的作用就是为了提高性能及减少开销,在JDK1.5以后的java.util.concurrent包中内置了很多不同使用场景的线程池,为了更好的理解它们,自己手写一个线程池,加深印象。


  概述


  1.什么是池


  它的基本思想就是一种对象池,程序初始化的时候开辟一块内存空间,里面存放若干个线程对象,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省系统的资源。


  2.使用线程池的好处


  合理的使用线程池可以重复利用已创建的线程,这样就可以减少在创建线程和销毁线程上花费的时间和资源。并且,线程池在某些情况下还能动态调整工作线程的数量,以平衡资源消耗和工作效率。同时线程池还提供了对池中工作线程进行统一的管理的相关方法。这样就相当于我们一次创建,就可以多次使用,大量的节省了系统频繁的创建和销毁线程所需要的资源。


Java线程池学习教程:实现简易线程池!


  包含功能:


  1.创建线程池,销毁线程池,添加新任务


  2.没有任务进入等待,有任务则处理掉


  3.动态伸缩,扩容


  4.拒绝策略


  介绍了线程池的原理以及主要组件之后,就让我们来手动实现一个自己的线程池,以加深理解和深入学习。因为自己实现的简易版本所以不建议生产中使用,生产中使用java.util.concurrent会更加健壮和优雅。


  代码


  以下线程池相关代码均在SimpleThreadPoolExecutor.java中,由于为了便于解读因此以代码块的形式呈现


  维护一个内部枚举类,用来标记当前任务线程状态,在Thread中其实也有.


      Java线程池学习教程:实现简易线程池!


  任务线程具体实现


  1.继承Thread,重写run方法。


  2.this.taskState==TaskState.FREE&&TASK_QUEUE.isEmpty()如果当前线程处于空闲状态且没有任何任务了就将它wait住,让出CPU执行权


  3.如果有任务就去执行FIFO(先进先出)策略


  4.定义close方法,关闭线程,当然这里不能暴力关闭,所以这里有需要借助interrupt


     Java线程池学习教程:实现简易线程池!


  简易版线程池,主要就是维护了一个任务队列和线程集,为了动态扩容,自己也继承了Thread去做监听操作,对外提供submit()提交执行任务、shutdown()等待所有任务工作完毕,关闭线程池


       Java线程池学习教程:实现简易线程池!


  测试一把


  创建一个测试类


     Java线程池学习教程:实现简易线程池!


  日志分析:从日志中可以看到,初始化的时候是2个线程在工作,执行速度较为缓慢,当经过第一次扩容后,会观察到线程池里线程个数增加了,执行任务的速度就越来越快了,本文一共扩容了2次,第一次是扩容到activeSize的大小,第二次是扩容到maxSize,在执行任务的过程中,当线程数过多的时候就会触发回收机制...


     Java线程池学习教程:实现简易线程池!


  总结


  通过本文,大致可以了解线程池的工作原理和实现方式,学习的过程中,就是要知其然知其所以然。这样才能更好地驾驭它,更好地去理解和使用,也能更好地帮助我们触类旁通,后面的文章中会详细介绍java.util.concurrent中的线程池。


      以上就是星辉Java培训机构小编介绍的“Java线程池学习教程:实现简易线程池!”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>