91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java優雅停機的實現及原理是什么

發布時間:2021-11-24 14:13:25 來源:億速云 閱讀:254 作者:柒染 欄目:編程語言

這篇文章給大家介紹Java優雅停機的實現及原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

優雅停機? 這個名詞我是服的,如果拋開專業不談,多好的名詞啊!

其實優雅停機,就是在要關閉服務之前,不是立馬全部關停,而是做好一些善后操作,比如:關閉線程、釋放連接資源等。

再比如,就是不會讓調用方的請求處理了一增,一下就中斷了。而處理完本次后,再停止服務。

Java語言中,我們可以通過Runtime.getRuntime().addShutdownHook()方法來注冊鉤子,以保證程序平滑退出。(其他語言也類似)

來個栗子:

public class ShutdownGraceFullTest {      /**      * 使用線程池處理任務      */     public static ExecutorService executorService = Executors.newCachedThreadPool();      public static void main(String[] args) {          //假設有5個線程需要執行任務         for(int i = 0; i < 5; i++){             final int id = i;             Thread taski = new Thread(new Runnable() {                 @Override                 public void run() {                     System.out.println(System.currentTimeMillis() + " : thread_" + id + " start...");                     try {                         TimeUnit.SECONDS.sleep(id);                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                     System.out.println(System.currentTimeMillis() + " : thread_" + id + " finish!");                 }             });             taski.setDaemon(true);             executorService.submit(taski);         }          // 添加一個鉤子處理未完任務         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {             @Override             public void run() {                  System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No1 shutdown hooking...");                 boolean shutdown = true;                 try {                     executorService.shutdown();                     System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() +  " shutdown signal got, wait threadPool finish.");                     executorService.awaitTermination(1500, TimeUnit.SECONDS);                     System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() +  " all thread's done.");                 }                 catch (InterruptedException e) {                     e.printStackTrace();                 }                 System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No1 shutdown done...");             }         }));          // 多個關閉鉤子并發執行         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {             @Override             public void run() {                 try {                     System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No2 shutdown hooking...");                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                 System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No2 shutdown done...");             }         }));          System.out.println("main method exit...");         // 故意調用jvm退出命令,發送關閉信號,否則正常情況下 jvm 會等待***一個非守護線程關閉才會退出         System.exit(0);     } }

運行結果如下:

Java優雅停機的實現及原理是什么

很明顯,確實是優雅了,雖然***收到了一關閉信號,但是仍然保證了任務的處理完成。很棒吧!

那么,在實際應用中是如何體現優雅停機呢?

kill -15 pid

通過該命令發送一個關閉信號給到jvm, 然后就開始執行 Shutdown Hook 了,你可以做很多:

  1. 關閉 socket 鏈接

  2. 清理臨時文件

  3. 發送消息通知給訂閱方,告知自己下線

  4. 將自己將要被銷毀的消息通知給子進程

  5. 各種資源的釋放

而在平時工作中,我們不乏看到很多運維同學,是這么干的:

kill -9 pid

如果這么干的話,jvm也無法了,kill -9 相當于一次系統宕機,系統斷電。這會給應用殺了個措手不及,沒有留給應用任何反應的機會。

所以,無論如何是優雅不起來了。

要優雅,是代碼

其中,線程池的關閉方式為:

executorService.shutdown();  executorService.awaitTermination(1500, TimeUnit.SECONDS);

ThreadPoolExecutor 在 shutdown 之后會變成 SHUTDOWN  狀態,無法接受新的任務,隨后等待正在執行的任務執行完成。意味著,shutdown 只是發出一個命令,至于有沒有關閉還是得看線程自己。

ThreadPoolExecutor 對于 shutdownNow 的處理則不太一樣,方法執行之后變成 STOP 狀態,并對執行中的線程調用  Thread.interrupt() 方法(但如果線程未處理中斷,則不會有任何事發生),所以并不代表“立刻關閉”。

shutdown()  :啟動順序關閉,其中執行先前提交的任務,但不接受新任務。如果已經關閉,則調用沒有附加效果。此方法不等待先前提交的任務完成執行。

shutdownNow():嘗試停止所有正在執行的任務,停止等待任務的處理,并返回正在等待執行的任務的列表。當從此方法返回時,這些任務將從任務隊列中耗盡(刪除)。此方法不等待主動執行的任務終止。

executor.awaitTermination(this.awaitTerminationSeconds, TimeUnit.SECONDS));  控制等待的時間,防止任務***期的運行(前面已經強調過了,即使是 shutdownNow 也不能保證線程一定停止運行)。

注意:

  • 虛擬機會對多個shutdownhook以未知的順序調用,都執行完后再退出。

  • 如果接收到 kill -15 pid 命令時,執行阻塞操作,可以做到等待任務執行完成之后再關閉 JVM。同時,也解釋了一些應用執行 kill -15  pid 無法退出的問題,如:中斷被阻塞了,或者hook運行了死循環代碼。

關于Java優雅停機的實現及原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰镇市| 太原市| 汉寿县| 和平县| 城固县| 温宿县| 宁都县| 武平县| 邢台市| 拉萨市| 英山县| 铜鼓县| 中西区| 延长县| 安徽省| 昂仁县| 万载县| 信宜市| 克什克腾旗| 嘉峪关市| 东阿县| 格尔木市| 滨海县| 小金县| 潼关县| 手机| 永宁县| 柞水县| 仲巴县| 安龙县| 宣威市| 辉县市| 黄石市| 同江市| 巴彦淖尔市| 嘉兴市| 吉木乃县| 宁强县| 星子县| 肥西县| 永胜县|