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