【多线程与高并发应用】1、借助addShutdownHook和线程的join方法优雅的退出while(true)循环(Scala实现)

文章介绍了Java的JVM关闭钩子addShutdownHook,在程序退出时执行指定操作,如资源释放。同时,通过示例展示了如何结合Thread的join方法确保主线程等待子线程执行完成。在Scala中创建了一个循环打印当前时间的子线程,当接收到关闭信号时,关闭钩子设置标志位并等待子线程结束,保证了程序优雅退出。
摘要由CSDN通过智能技术生成
  • addShutdownHook 是jvm中的关闭钩子。当程序退出时,会执行添加的shutdownHook线程。其中shutdownHook是一个已初始化但并没有启动的线程,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以,可通过这些钩子在jvm关闭的时候进行内存清理、资源回收等工作。
  • 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
  • join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在主线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。

下面是基于Scala实现的一个,利用 addShutdownHook 和 Thread 的join方法退出 while(true)循环的一个例子:

    var isRunning = true

    val t = new Thread(() => {

      while (isRunning) {

        println(s"当前时间: ${System.currentTimeMillis()}")

        Thread.sleep(Duration.ofSeconds(1).toMillis)

      }

      println(s"${Thread.currentThread().getName} 线程循环结束 ! ")

    })

    t.start()

    sys.addShutdownHook {
      isRunning = false

      println("addShutdownHook, 程序即将退出...")

      t.join()

      println(s"${Thread.currentThread().getName} 线程结束 ! ")
    }

当手动终止程序时,输出结果为:

当前时间: 1680770676734
当前时间: 1680770677741
当前时间: 1680770678742
当前时间: 1680770679743
当前时间: 1680770680744
addShutdownHook, 程序即将退出...
Thread-0 线程循环结束 ! 
shutdownHook1 线程结束 ! 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值