Java线程池,你了解多少?

   随着业务的发展,单线程已经远远不能满足,随即就有多线程的出现。多线程虽然能解决单线程解决不了的事情,但是它也会给你带来额外的问题。比如成千上万甚至上百万的线程时候,你系统就会出现响应延迟、卡机、甚至直接卡死的情况。为什么会出现这样的原因呢?因为为每个请求创建一个新线程的开销很大:在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多

  除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。在一个 JVM里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。所以为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目。而线程池为线程生命周期开销问题和资源不足问题提供了解决方案。

二、那么线程池有哪些作用呢?

  1、降低资源消耗,防止资源不足。合理配置线程池中的线程大小,防止请求线程猛增;另外通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2、提高响应速度。线程池可以通过对多个任务重用线程,在请求到达时线程已经存在(如果有空闲线程时),所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。
  3、提高线程的可管理性。使用线程池可以统一分配、调优和监控线程。

  上面知道了线程池的作用,那么线程池它是如何工作的呢?其使用核心类是哪一个呢?所以要做到合理利用线程池,必须对其实现原理了如指掌。

三、线程池中核心类:ThreadPoolExecutor

  java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,所以必须了解这个类的用法及其内部原理,下面我们来看下ThreadPoolExecutor类的具体源码解析。

3.1  继承关系

  通过类的继承关系可以得知哪些方法源于哪里(具体请看代码),下面直接给出类的继承结构的图:

Java线程池,你了解多少?

3.2 构造方法   

  在ThreadPoolExecutor类中提供了四个构造方法:

Java线程池,你了解多少?

Java线程池,你了解多少?

1 // 五个参数的构造函数 2 public class ThreadPoolExecutor extends AbstractExecutorService { 3 public ThreadPoolExecutor(int corePoolSize, 4 int maximumPoolSize, 5 long keepAliveTime, 6 TimeUnit unit, 7 BlockingQueue<Runnable> workQueue) { 8 this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 9 Executors.defaultThreadFactory(), defaultHandler); 10 } 11 // 六个参数的构造函数-1 12 public ThreadPoolExecutor(int corePoolSize, 13 int maximumPoolSize, 14 long keepAliveTime, 15 TimeUnit unit, 16 BlockingQueue<Runnable> workQueue, 17 ThreadFactory threadFactory) { 18 this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 19 threadFactory, defaultHandler); 20 } 21 22 //六个参数的构造函数 -2 23 public ThreadPoolExecutor(int corePoolSize, 24 int maximumPoolSize, 25 long keepAliveTime, 26 TimeUnit unit, 27 BlockingQueue<Runnable> workQueue, 28 RejectedExecutionHandler handler) { 29 this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 30 Executors.defaultThreadFactory(), handler); 31 } 32 // 七个参数的构造函数 33 public ThreadPoolExecutor(int corePoolSize, 34 int maximumPoolSize, 35 long keepAliveTime, 36 TimeUnit unit, 37 BlockingQueue<Runnable> workQueue, 38 ThreadFactory threadFactory, 39 RejectedExecutionHandler handler) { 40 if (corePoolSize < 0 || 41 maximumPoolSize <= 0 || 42 maximumPoolSize < corePoolSize || 43 keepAliveTime < 0) 44 throw new IllegalArgumentException(); 45 if (workQueue == null || threadFactory == null || handler == null) 46 throw new NullPointerException(); 47 this.corePoolSize = corePoolSize; 48 this.maximumPoolSize = maximumPoolSize; 49 this.workQueue = workQueue; 50 this.keepAliveTime = unit.toNanos(keepAliveTime); 51 this.threadFactory = threadFactory; 52 this.handler = handler; 53 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydfgf.html