java9新特性-Process 进程 API

前言

java process API 开始于1.5 ,但是功能不够,没有被大众熟知。如今很多语言,都能很好的对进程做控制,所以java9 这次的更新算是做出了一些更新,以下是总结的几点,并非全部,而是认为比较关键的几个方面。

创建进程并且终止

new ProcessBuilderder 创建了一个命令,让系统休息5s, 第一个参数是cmd,第二个参数是cmd的参数。onExit()返回一个future,通过get()方法,让其阻塞等到进程执行完再推出。

    public static void processBuilder() {
        ProcessBuilder builder = new ProcessBuilder("/bin/sleep", "5");
        try {
            Process process = builder.start();
            System.out.println("pid:" + process.pid());//获取进程id
            System.out.println(process.isAlive());
            try {
                process.onExit().get();//终止进程
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            System.out.println(process.isAlive());
//            process.isAlive();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

获取当前java进程信息

ProcessHandle 是1.9 推出的。里面包含很多对进程的信息获取和处理方法,这是此次更新的核心类。

public static void givenCurrentProcessInfo() {

        ProcessHandle processHandle = ProcessHandle.current();
        ProcessHandle.Info processInfo = processHandle.info();

        System.out.println(processHandle.pid());
        //获取参数信息
        for (String s : processInfo.arguments().get()) {
            System.out.println("argument:"+ s);
        }

    }

获取所有进程信息

allProcess 获取当前系统运行的所有进程信息

public static void getAllProcess() {
        Stream<ProcessHandle> liveProcesses = ProcessHandle.allProcesses();
        liveProcesses.forEach(x->{
            if (x.isAlive()) {
                System.out.println("pid" + x.pid());
                x.info();//可以获取到更细致的内容
            }
        });
    }

获取创建的子进程信息

通过ProcessBuilder 创建了一个进程,该进程是在当前java进程产生的,所以自然是当前的子进程。然后通过current().childeren()获取子进程。

有两种获取子进程方法
- 获取直接的子进程 用children()
- 获取所有的子进程递归的descendants()

public static void getChildProcess() {
        ProcessBuilder processBuilder = new ProcessBuilder("java", "-version");
        try {
            processBuilder.start();//创建子进程
            Stream<ProcessHandle> children
                    = ProcessHandle.current().children();
            children.forEach(x->{
                System.out.println("cmd:" + x.info().command().get()+ " argument:" + x.info().arguments().get()[0]);
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值