Java中的线程池

合理使用线程池的好处

  • 降低资源消耗

    通过重复利用已创建的线程降低线程创建和的销毁造成的消耗

  • 提高响应速度

    当任务到达时,任务可以不需要等到线程创建就能立即执行

  • 提高线程的可管理性

    线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优、监控

线程池的实现原理

线程池的处理流程

  • 线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程
  • 线程池铺垫工作队列是否已满。如果工作队列没有满,则将新提交的任务存储在这个工作队列中。如果工作队列慢了,则进入下一个流程
  • 线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程來执行任务。如果已满,则交给饱和策略来处理这个任务

流程图图如下:

ThreadPoolExector执行execute

ThreadPoolExecutor执行execute方法分为4种情况:

  • 1 如果当前线程少于corePoolSize,则创建新线程来执行任务
  • 2 如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue
  • 3 如果无法将任务加入BlockingQueue,则创建新的线程来处理任务
  • 4 如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用异常方法

线程池中的线程执行任务分两种情况

  • execute()方法中创建一个线程时,会让这个线程执行当前任务

  • 这个线程执行完下图中1的任务后,会反复从BlockingQueue中获取任务来执行

线程池的使用

线程池的创建
通过ThreadPoolExecutor来创建一个线程池

new ThreadPoolExecutor(int corePoolSize,
                   int maximumPoolSize,
                   long keepAliveTime,
                   TimeUnit unit,
                   BlockingQueue<Runnable> workQueue)

创建一个线程需要输入几个参数

  • corePoolSize:线程池的基本大小
  • maximumPoolSize:线程池最大数量
  • keepAliveTime:线程活动保持时间
  • unit:线程活动保持时间单位
  • workQueue:任务队列

向线程池提交任务

使用两个方法向线程池提交任务

  • execute()方法:

    execute()方法用于提交不需要返回值得任务,所以无法判断任务是否被线程池执行成功

  • submit()方法:

    submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,get(long timeout,TimeUnit unit) 方法则会阻塞当前线程一段时间后立即返回,这种情况下有可能任务没有执行完成。

关闭线程池

通过调用线程池的shutdownshutdownNow方法关闭线程池。

shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有正在执行或暂停任务的线程,并返回等待执行任务的列表。

shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行的任务的线程。

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值