概述
前言
最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分框架运行lock文件,这里就想到了shutdownhook,顺便学了学Runtime的使用
1. shutdownhook
demo示例,证明在程序正常结束的时候会调用,如果kill -9 那肯定就不会调用了
public class ShutdownHookTest { public static void main(String[] args) { System.out.println("==============application start================"); Runtime.getRuntime().addShutdownHook(new Thread(()->{ System.out.println("--------------hook 1----------------"); })); Runtime.getRuntime().addShutdownHook(new Thread(()->{ System.out.println("--------------hook 2----------------"); })); System.out.println("==============application end================"); } }
正常运行结束,结果如下
==============application start================
==============application end================
--------------hook 1----------------
--------------hook 2----------------
Process finished with exit code 0
如果暂停,点击下图左下角的正方形红图标,停止正在运行的应用
结果如下,shutdownhook已执行。
shutdownhook可以处理程序正常结束的时候,删除文件,关闭连接等
2. exec执行
2.1 常规命令执行
demo示例如下,比如ls
public class ShutdownHookTest { public static void main(String[] args) throws InterruptedException, IOException { Process process = Runtime.getRuntime().exec("ls"); try (InputStream fis = process.getInputStream(); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr)) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } }
结果如下
而正常执行结果
但是这个方法有远程执行风险,即在浏览器端通过这个方法执行特定指令,比如执行rm -rf *,结果就很……
2.2 管道符
但是遇见管道符之后就会失效,什么办法解决,sh -c,但是不能直接用,否则获取到的是TTY窗口信息
public static void main(String[] args) throws IOException { Process process = Runtime.getRuntime().exec("sh -c ps aux|grep java"); try (InputStream fis = process.getInputStream(); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr)) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } }
结果
最后
以上就是唠叨小蝴蝶为你收集整理的Java Runtime的使用详解的全部内容,希望文章能够帮你解决Java Runtime的使用详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复