真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

通過(guò)JDK源碼分析關(guān)閉鉤子詳解-創(chuàng)新互聯(lián)

關(guān)閉鉤子

創(chuàng)新互聯(lián)主打移動(dòng)網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、域名注冊(cè)、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻?hù)承諾穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。

用戶(hù)關(guān)閉關(guān)閉程序,需要做一些善后的清理工作,但問(wèn)題是,某些用戶(hù)不會(huì)按照推薦的方法關(guān)閉應(yīng)用程序,肯能導(dǎo)致善后工作無(wú)法進(jìn)行。像tomcat調(diào)用server的start方法啟動(dòng)容器,然后會(huì)逐級(jí)調(diào)用start。當(dāng)發(fā)出關(guān)閉命令是會(huì)啟動(dòng)關(guān)閉功能,但是關(guān)閉可能會(huì)有一些意外產(chǎn)生,導(dǎo)致應(yīng)用程序沒(méi)有進(jìn)入到我們制定的關(guān)閉方法去。如何解決這個(gè)問(wèn)題呢,使得即使有意外也能正常進(jìn)入關(guān)閉流程。

好在java提供了一種優(yōu)雅的方式去解決這種問(wèn)題。使得關(guān)閉的善后處理的代碼能執(zhí)行。java的關(guān)閉鉤子能確保總是執(zhí)行,無(wú)論用戶(hù)如何終止應(yīng)用程序。除非用戶(hù)kill,這個(gè)是個(gè)死穴。

Java提供了Shutdown Hook機(jī)制,它讓我們?cè)诔绦蛘M顺龌蛘甙l(fā)生異常時(shí)能有機(jī)會(huì)做一些清場(chǎng)工作。使用的方法也很簡(jiǎn)單,Java.Runtime.addShutdownHook(Thread hook)即可。關(guān)閉鉤子其實(shí)可以看成是一個(gè)已經(jīng)初始化了的但還沒(méi)啟動(dòng)的線程,當(dāng)JVM關(guān)閉時(shí)會(huì)并發(fā)地執(zhí)行注冊(cè)的所有關(guān)閉鉤子。

對(duì)java而言,虛擬機(jī)會(huì)對(duì)以下幾種操作進(jìn)行關(guān)閉:


      (1)系統(tǒng)調(diào)用System.exit()方法


      (2)程序最后一個(gè)守護(hù)線程退出時(shí),應(yīng)用程序正常退出。


      (3)用戶(hù)強(qiáng)行中斷程序運(yùn)行,比如ctrl+c等其他方式中斷java程序

關(guān)閉鉤子的生成:


    1.創(chuàng)建Thread的子類(lèi)


    2.實(shí)現(xiàn)run方法,應(yīng)用程序關(guān)閉時(shí)會(huì)調(diào)用該方法,不需要調(diào)用start方法


    3.在應(yīng)用中實(shí)例化關(guān)閉鉤子類(lèi)


    4.使用Runtime注冊(cè)關(guān)閉鉤子

鉤子執(zhí)行時(shí)機(jī)

向JVM注冊(cè)關(guān)閉鉤子后的什么時(shí)候會(huì)被調(diào)用,什么時(shí)候不會(huì)被調(diào)用呢?分成以下情況:

  • Java程序正常運(yùn)行完退出時(shí)會(huì)被調(diào)用。
  • windows和linux終端中通過(guò)ctrl-c終止命令時(shí)會(huì)被調(diào)用。
  • JVM發(fā)生OutOfMemory而退出時(shí)會(huì)被調(diào)用。
  • Java程序中執(zhí)行System.exit()時(shí)會(huì)被調(diào)用。
  • 操作系統(tǒng)關(guān)閉時(shí)會(huì)被調(diào)用。
  • linux通過(guò)kill pid(除了kill -9 pid)結(jié)束進(jìn)程時(shí)會(huì)被調(diào)用。
  • windows直接結(jié)束進(jìn)程時(shí)不會(huì)被調(diào)用。

添加刪除鉤子

鉤子的添加和刪除都是通過(guò) Runtime 來(lái)實(shí)現(xiàn),里面的實(shí)現(xiàn)也比較簡(jiǎn)單,可以看到 addShutdownHook 和 removeShutdownHook 方法都是先通過(guò)安全管理器先檢查是否有 shutdownHooks 的權(quán)限,然后再通過(guò) ApplicationShutdownHooks 添加和刪除鉤子。

public void addShutdownHook(Thread hook) {
  SecurityManager sm = System.getSecurityManager();
  if (sm != null) {
   sm.checkPermission(new RuntimePermission("shutdownHooks"));
  }
  ApplicationShutdownHooks.add(hook);
 }

public boolean removeShutdownHook(Thread hook) {
  SecurityManager sm = System.getSecurityManager();
  if (sm != null) {
   sm.checkPermission(new RuntimePermission("shutdownHooks"));
  }
  return ApplicationShutdownHooks.remove(hook);
 }

網(wǎng)站名稱(chēng):通過(guò)JDK源碼分析關(guān)閉鉤子詳解-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/iiosd.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部