化學中我們得知「氫氣加氧氣在點燃的情況下會生成水」。
生活中我們得知「良辰加美景的情況下會得到千金春宵一刻」。
技術上又何嘗不是如此呢?先假設一個場景:BOSS 讓你實作一個服務監控的指揮室,能看到每個伺服器的磁盤剩餘空間,能看到。。。能看到。。。
其實講真,實作思路有很多,但是不管黑貓白貓能抓住老鼠都是好貓,今天我們嘗試用 Java 與 Shell 搭配一下,看看是否會産生驚奇的反應。
1.
首先通過 JDK 源碼,品一品 Runtime 這杯美酒。

上圖是摘取 JDK 中 Runtime 的部分源碼,主要分成 4 大代碼段來粗略認識她。
第一塊代碼段,可以看出 Runtime 構造私有化,提供了靜态屬性,并提前建立對象執行個體,并提供擷取執行個體的靜态方法,這不就是單例設計模式的使用麼,當有面試官再問設計模式,拿去狂噴。
第二塊代碼段,主要是 addShutdownHook() 方法,添加關閉的鈎子,說的直白點,其實允許研發人員插入一段在 JVM 關閉時執行的代碼。例如在搭建服務架構時,面對需要完成優雅停服,打掃戰場,釋放資源等等,諸如此類的場景下都很有用。其中在 Tomcat、Jetty 等容器中都可以看到 shutdownHook 的身影。
Runtime runtime = Runtime.getRuntime();runtime.addShutdownHook(new Thread() { @Override public void run() { System.out.println("打掃戰場,釋放資源,完成優雅停服"); }});System.out.println("服務啟動完成");
代碼運作效果如下。
服務啟動完成打掃戰場,釋放資源,完成優雅停服
第三塊代碼段,主要展現 JDK 針對 Runtime 提供的系列 exec 重載方法,這個是本次分享的重點,重頭戲最後再說。
第四塊代碼段,主要是 Runtime 提供的一些擷取系統資訊的 API,直接抛代碼,拿去用就行了。
Runtime runtime = Runtime.getRuntime();System.out.println(String.format("JVM可用本機CPU核心數 %d