Java面试篇基础部分-Java线程池工作原理

  线程池的出现,主要是用来管理一组线程的工作运行状态,这样可以方便JVM更好的利用CPU资源。

  Java线程池的工作原理:JVM先根据用户的参数创建一定数量的可运行的线程任务,并且将这些任务放入到队列中,在线程创建之后,启动这些任务。

  如果当线程数超过最大线程数,这个线程数是由用户在创建线程池的时候进行设计的。对于超过数量的线程来说进行等候排队,等待其他线程执行完毕之后,线程池会发现可用的线程,进行再次从队列中获取到任务并执行。

  线程池的主要作用是线程复用、线程资源管理、控制操作系统的最大并发数量,从而保证系统的高效运行,这个高效运行时通过线程池内部的资源重复利用来实现。并且通过控制最大并发数保证系统资源的合理利用。

线程的复用

  如果我们对于线程进行抽象的话,那么每个Thread类都有一个start()方法,在程序调用到start方法之后线程启动,JVM会调用这个类的run方法。之前提到过,Thread类的run方法其实调用了Runnbale的run方法。所以,继承了Thread类,在start方法中不断循环调用传入的Runnable对象,程序就不断的执行run方法中的代码。

  这样的话可以将方法中的Runnbale对象,放入到一个Runnbale的队列中,当线程在获取到下一个Runnbale对象的时候可以进行阻塞,这样可以控制正在执行的线程的数量,也可以有效的保证系统中的线程等待其他正确的线程执行完毕,这样的一个机制就是线程池,可以对队列以及创建的线程资源进行重复的利用。多个Runnbale可以被一个Thread对象重复调用start方法来执行。

线程池的核心组件和核心类

  Java中的线程池有如下的几个核心组件组成

  • 线程池管理器:用于创建并且管理线程池
  • 工作线程:线程池中正在执行的具体的任务的线程
  • 任务接口:用来定义工作线程如何调度,如何执行,线程实现了这个接口,才能被线程池认可,进入线程池的管理调度。
  • 任务队列:用来存放需要处理的等待任务,新任务会不断地进入到队列中进行等待,执行完成之后任务会被从队列中移除

  Java中线程池机制是通过Executor框架进行实现的
在这里插入图片描述
  在框架中用到Executor、Executors、ExecutorService、ThreadPoolExecutor、Callable、Future、FutureTask一些核心类。其中,ThreadPoolExecutor 是用来构建线程的核心,代码如下

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
   
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

  这个类的构造方法有如下几个参数

  • corePoolSize:线程池中核心线程的数量
  • maximumPoolSize:线程池中最大线程的数量
  • keepAliveTime:当前线程数量超过corePoolSize的时候,空闲线程存活时间
  • unit:keepAliveTime的时间单位
  • workQueue:任务队列,已经提交但未被执行的任务存放的空间
  • threadFactory:线程工厂,用于创建线程。
  • handler:用来处理任务过多或者其他的原因导致线程池无法处理的时候,任务的拒绝策略。

线程池的工作流程

在这里插入图片描述
  Java线程池工作流程:线程被创建的时候,向系统申请一个用于执行线程队列和管理线程的资源,然后调用execute()添加任务会按照下面的流程执行任务

  • 1、如果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值