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

  • 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 线程结束 ! 

你可能感兴趣的:(多线程与高并发,scala,jvm,java)