首页 > 其他分享 >面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!

面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!

时间:2024-06-02 21:57:36浏览次数:26  
标签:shutdown 执行器 面试官 shutdownNow mainLock 线程 关闭

写在开头


面试官:“小伙子,线程池使用过吗,来聊一聊它吧!”

我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问…”

面试官满意的点了点头,紧接着问道:“那你知道如何优雅的关闭线程池吗?”

我:“知道知道,直接调用shutdownNow()方法就好了呀!”

面试官脸色一变,微怒道:“粗鲁!你给我滚出去!!!”


优雅的关闭线程池

哈哈,上面的场景是build哥臆想出来的面试画面,我们现在步入正题,来看一看在线程池使用完成后如何优雅的关闭线程池。

在JDK 1.8 中,Java 并发工具包中 java.util.concurrent.ExecutorService 提供了 shutdown()、shutdownNow()这两种接口方法去关闭线程池,我们分别看一下。

shutdown()

public void shutdown() {
   
    final ReentrantLock mainLock = this.mainLock; // ThreadPoolExecutor的主锁
    mainLock.lock(); // 加锁以确保独占访问

    try {
   
        checkShutdownAccess(); // 检查是否有关闭的权限
        advanceRunState(SHUTDOWN); // 将执行器的状态更新为SHUTDOWN
        interruptIdleWorkers(); // 中断所有闲置的工作线程
        onShutdown(); // ScheduledThreadPoolExecutor中的挂钩方法,可供子类重写以进行额外操作
    } finally {
   
        mainLock.unlock(); // 无论try块如何退出都要释放锁
    }
    tryTerminate(); // 如果条件允许,尝试终止执行器
}

在shutdown的源码中,会启动一次顺序关闭,在这次关闭中,执行器不再接受新任务,但会继续处理队列中的已存在任务,当所有任务都完成后,线程池中的线程会逐渐退出。

我们写一个小的demo来使用shutdown():

public class TestService{
   
    public static void main(String[] args) {
   
        //创建固定 3 个线程的线程池,测试使用,工作中推荐ThreadPoolExecutor
        ExecutorService threadPool = Executors.newFixedThreadPool(3

标签:shutdown,执行器,面试官,shutdownNow,mainLock,线程,关闭
From: https://blog.csdn.net/qq_43506040/article/details/139296388

相关文章

  • 线程创建的函数及应用小结
    进程是计算机分配资源的基本单位,线程是cpu调度的基本单位线程基本概念:LWP:lightweightprocess轻量级的进程。创建线程的底层函数和进程一样,都是clone,因此线程的本质仍是进程(在linux环境下)与进程相比,线程有独立的TCB结构体(类似于进程的PCB),但没有独立的地址空间(共享),类似于合租......
  • 线程池的实现源码及应用举例
    1.线程池本质​多个线程组成的一个集合,目的为了并发执行任务,定义时是一个结构体,成员有互斥锁,条件变量,任务链队列指针,任务链队列中等待的任务个数,当前活跃的线程数量,线程ID,线程销毁标记等2.线程池的关键技术(1)万能函数指针(通用函数指针):*void*(*p)(voi......
  • Java面试题:解释一下Java中的synchronized关键字,它是如何保证线程安全的?
    在Java中,synchronized关键字是一种同步锁机制,用于确保多个线程在访问共享资源时能够保持线程安全。线程安全是指在多线程环境下,当多个线程尝试同时访问共享资源时,任何时刻最多只有一个线程能够执行特定的代码段。synchronized关键字可以用于以下几个方面:方法同步:当synch......
  • Redis单线程
    Redis是基于Reactor模式开发的网络事件处理器,这个处理器是单线程的,所以redis是单线程的。为什么它是单线程还那么快呢?主要有以下几个原因:一、纯内存操作由于Redis是纯内存操作,相比于磁盘来说,内存就快得多,这个是Redis快的主要原因。二、多路复用I/O机制(NIO)Re......
  • 信号量(Semaphore),事件Event(了解),队列补充,进程池和线程池(重点),协程理论,Greenlet,Gevent模
    Ⅰ信号量(Semaphore)【一】什么是信号量信号量Semahpore(同线程一样)互斥锁:允许在同一时刻只能有一个线程或进程同资源进行修改信号量:允许指定数量的进程或线程对资源进行修改【二】例子比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去......
  • 【JUC】3-用户线程和守护线程
    一般情况下不做特别说明配置,默认都是用户线程 UserThread是系统的工作线程,它会完成这个程序需要完成的业务操作 DaemonThread是一种特殊的线程,为其它线程服务的,在后台默默的完成一些系统性的服务,比如垃圾回收线程就是最典型的例子守护线程作为一个服务线程,没有服务对象......
  • Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式 (尼恩)电子版百度云
    书获取链接:python33  。c o  m我的阅读笔记:多线程:介绍Java多线程的基础概念,如线程的创建、启动、状态转换、线程间通信等。锁:深入探讨Java中的各种锁机制,包括内置锁(synchronized)、ReentrantLock、ReadWriteLock等,以及它们的使用场景和性能特点。Java内存模型(JMM):解释J......
  • 心链6----开发主页以及后端数据插入(多线程并发)定时任务
    心链—伙伴匹配系统开发主页信息搜索页修改主页开发(直接list用户)在后端controller层编写接口去实现显示推荐页面的功能/***推荐页面*@paramrequest*@return*/@GetMapping("/recommend")publicBaseResponse<List<User>>......
  • Java 线程诊断实战-全面解锁线程转储分析技巧
    大家好!今天,我将为大家带来一个非常实用的主题——如何高效诊断和分析Java线程问题。无论是死锁、线程阻塞,还是资源耗尽等情况,都可能会给线上系统带来严重的影响。而恰当地使用线程转储(ThreadDump)工具无疑是定位和解决问题的重要一环。让我们一同来学习和掌握相关的......
  • JAVA基础|多线程
    什么是线程?线程(Thread)是一个程序内部的一条执行流程。多线程是什么?多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)一.如何在程序中创建出多条线程?Java是通过java.lang.Thread类的对象来代表线程的。1.多线程的创建方式一:继承Thread类定义一......