资讯专栏INFORMATION COLUMN

使用java.lang.Process类的简单例子

MonoLog / 2594人阅读

摘要:在之前,都是由类处来实现进程的控制管理。导致当前线程等待,如有必要,一直要等到由该对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。为了防止进程无限阻塞或者死锁,使用类时,需要加上超时控制,详细内容可以看博文工具类,提供设置功能。

ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。本文简单介绍一下Process类的用法以及一些需要注意的问题。

  

API方法说明如下:
- destroy() 杀掉子进程。
- exitValue() 返回子进程的出口值。该方法不阻塞,如果此 Process 对象表示的子进程尚未终止,就会抛出IllegalThreadStateException异常,中止进程
- getErrorStream() 获取子进程的错误流
- getInputStream() 获取子进程的输入流
- getOutputStream() 获取子进程的输出流,基本上不会用到输出流
- waitFor() 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。导致当前线程等待,如有必要,一直要等到由该 Process对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程

一个简单的例子:

/**
 * 列出所有的进程信息
 */
public class ListAllProcessTest {
    public static void main(String[] args) {
        BufferedReader br = null;
        Process process = null;
        try {
            process = Runtime.getRuntime().exec("tasklist");
            br = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
            String line = null;
            System.out.println("列出所有正在运行的进程信息:");
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(process!=null){
                process.destroy();
            }
        }
    }
}

程序输出如下:

直接在WIN7的命令行执行命令:tasklist,输出结果如下:

注意问题:
因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。为了防止进程无限阻塞或者死锁,使用Process类时,需要加上超时控制,详细内容可以看博文《Process工具类,提供设置timeout功能》。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64021.html

相关文章

  • Java 9 的主要新特性

    摘要:今晚将正式发布。竞争锁的性能优化能够改善程序运行时的多线程同步效率。模块化这就是令跳票数次的罪魁祸首。优化字符串占用空间在很多应用当中,字符串已经成为一个消耗内存的主要部分。 今晚 Java 9 将正式发布。Java 9 的新特性都列在官方页面当中,本文介绍值得你关注的其中几个点: ▶ 进程操作改进(JEP 102: Process API Updates) 新增的 java.lang...

    junbaor 评论0 收藏0
  • 使用Prometheus+Grafana监控JVM

    摘要:摘要用到的工具,本文大量使用了来启动各个应用。,负责抓取存储指标信息,并提供查询功能。,负责数据可视化。,提供中和相关的。先讲一下大致步骤利用,在进程内启动一个小型的配置抓取那个提供的。第三步配置启动访问,使用登录。 原文地址 本文所提到的脚本可以在这里下载。 摘要 用到的工具: Docker,本文大量使用了Docker来启动各个应用。 Prometheus,负责抓取/存储指标信息...

    YuboonaZhang 评论0 收藏0
  • 使用Prometheus+Alertmanager告警JVM异常情况

    摘要:,负责抓取存储指标信息,并提供查询功能,本文重点使用它的告警功能。,负责将告警通知给相关人员。配置的告警触发规则使用超过最大上限的机时间超过秒分钟分钟时间在最近分钟里超过配置连接,配置。 原文地址 在前一篇文章中提到了如何使用Prometheus+Grafana来监控JVM。本文介绍如何使用Prometheus+Alertmanager来对JVM的某些情况作出告警。 本文所提到的脚本可...

    lushan 评论0 收藏0
  • 聊聊Typescript中的设计模式——装饰器篇(decorators)

    摘要:本文从装饰模式出发,聊聊中的装饰器和注解。该函数的函数名。不提供元数据的支持。中的元数据操作可以通过包来实现对于元数据的操作。   随着Typescript的普及,在KOA2和nestjs等nodejs框架中经常看到类似于java spring中注解的写法。本文从装饰模式出发,聊聊Typescipt中的装饰器和注解。 什么是装饰者模式 Typescript中的装饰器 Typescr...

    yiliang 评论0 收藏0

发表评论

0条评论

MonoLog

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<