java1.8之后,Process有了destroy和destroyForcibly方法,用来结束进程,一般结束进程的流程为:

terminate process with destroy()

allow process to exit gracefully with reasonable timeout

kill it with destroyForcibly() if process is still alive

但是在java1.8的实现中,下面是源码:

public Process destroyForcibly(){

destroy();

return this;

}

可以看到destroyForcibly和destroy是等效的,这样就有一个问题,如果一段时间后destroy无法关闭进程,那么destroyForcibly又怎么能保证能强制关闭进程呢?除此之外,如果新进程又开启了一个新的子进程,又如何关闭新的子进程呢?(虽然这是新进程的责任,但是在'强制关闭'的情况下,新进程应该无法保证能顺利的关闭子进程)。

在java9+中,Process有了一个新的方法:toHandle,可以获取到 ProcessHandle对象,这个对象也有 destroy和destroyForcibly这两个方法,看了下它们的实现,是一个native方法

private static native boolean destroy0(long pid, long startTime, boolean forcibly);

应该比Process的更加可靠,至少强制关闭看起来不再是自欺欺人,而ProcessHandle还提供了一个children方法:

Returns a snapshot of the current direct children of the process.The parent of a direct child process is the process.Typically, a process that is not alive has no children.

这个方法可以获取进程的直接子进程,通过

p.children().forEach(ProcessHandle::destroy);

可以关闭它的直接子进程。如果这还不够,还有一个descendants方法,可以返回直接子进程以及子进程的子进程。

Returns a snapshot of the descendants of the process.The descendants of a process are the children of the processplus the descendants of those children, recursively.Typically, a process that is not alive has no children.

所以java9以及以后

ProcessHandle handle = p.toHandle();

handle.destroy();

handle.descendants().forEach(ProcessHandle::destroy);

应该是更好的关闭方法

java中结束进程的方法_java关闭Process相关推荐

  1. java中容易混淆的方法_java中容易混淆的区别

    本文会随时更新一些java中容易混淆的关键字或者知识点,如有偏见之处,望留言! final和static的差别: 1,final的英语意思"最后的",在java中修饰类,方法和变量 ...

  2. java中私有变量和方法_Java 私有变量和私有方法

    作者: Jakob Jenkov 译者:叶文海(yewenhai@gamil.com) 内容索引 访问私有变量 访问私有方法 在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是 Java ...

  3. java中无限循环的方法_Java中的无限循环

    Java中的无限循环 在Java中查看下面的无限while循环. 它会导致它下面的语句编译时错误. while(true) { System.out.println("inside whil ...

  4. java中容易混淆的方法_java中容易混淆的概念

    java中容易混淆的概念 1. 谈谈 final, finally, finalize 的区别final-修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不 能作为父类被 ...

  5. 在java中班级的表示方法_Java基础班学习笔记(8)

    1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.java 如何 ...

  6. 在java中班级的表示方法_java班级类起名怎么起-javaclass怎起名

    java中class后面类的名字需要和创建类的时候输入的名字一样吗? 是的,否则将是错误的 给学习java的班里去取个好听的名字 房东,您应该在班级中选择您的姓名,或在JAVA班级中选择名称 java ...

  7. java中获取绝对值的方法_Java判断绝对值的方法总结

    if-else语句判断: import java.util.Scanner; public class AbsoluteValue { public static void main(String[] ...

  8. java中实现线程的方法_Java中实现线程的方法

    Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 第一种:继承Thread类 new Thread(){}.start();这表示调 ...

  9. java中继承内部类的方法_Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...

最新文章

  1. 排序--直接插入排序
  2. 双目视觉——SGM中的动态规划
  3. Android屏幕方向调整的两种方式
  4. 用php编写一个强迫身份认证,php创建基本身份认证站点的实现方法
  5. GDCM:gdcm::SplitMosaicFilter的测试程序
  6. Cocos2d-JS v3.0 alpha
  7. 关于磁盘爆满异常(Linux下已经删除文件继续占用空间问题)
  8. 当子元素用position:relative;时,父元素的overflow:hidden;在ie中失效的解决办法
  9. Ambari架构源码解析
  10. MySQL group_concat函数使用详解
  11. 选什么专业?找什么样的工作?教你四个维度
  12. 【前端 · 面试 】HTTP 总结(十一)—— HTTPS 概述
  13. Nginx+Tomcat负载平衡
  14. EditText的属性介绍
  15. 手持式矢量网络分析仪
  16. 响应式web开发 许愿墙
  17. 坐标求四面体体积_解析几何课程中求四面体体积新方法探究
  18. Pyramidal Convolution: Rethinking Convolutional Neural Networks for Visual Recognition阅读笔记
  19. 数据结构-----------------------哈希表(最通俗易懂的文章)
  20. vector(向量)的简单操作

热门文章

  1. 亚马逊物流批量清货计划的优势你知道?
  2. 大脑中的学习机制: 海马体与新皮层构成的互补学习系统
  3. Cyberpunk2077—赛博朋克2077 中代码矩阵解密小游戏之最优解寻找
  4. 局域网内如何共享文件夹,如何解决文件共享的安全性?
  5. PowerDesigner配置mysql odbc数据源
  6. ZOJ 1711 Sum It Up(DFS)
  7. html怎么创百度搜索框,JS实现百度搜索框
  8. 按键精灵 缺少对象mysql_按键精灵无论2014最新版还是09版本的都出现缺少对象: 'QMLibrary' _ BUG反馈与功能建议 - 按键精灵论坛...
  9. brisk matlab,关于计算机视觉:MATLAB中SURF和BRISK点的比例域
  10. 林肯公园 震撼numb