美文网首页
Process API 学习笔记

Process API 学习笔记

作者: freeseawind | 来源:发表于2018-07-22 19:21 被阅读0次
    开发环境
    • eclipse 4.7.3a
    • jdk 9
    主题
    • 获取进程信息
    • 获取进程输出信息
    • 过滤进程信息
    • 处理进程终止时回调
    • 控制对敏感进程信息的访问

    进程 API允许启动,检索有关本机操作系统进程的信息并对其进行管理

    JDK 提供了下列进程API:

    • ProcessBuilder
    • Process
    • ProcessHandle
    • ProcessHandle.Info
    获取进程信息

    以下代码演示如果获取当前ping命令进程信息:

    // 创建进程生成器
    ProcessBuilder pb = new ProcessBuilder("ping", "-n", "3", "www.163.com");
    
    // 启动进程
    Process process = pb.start();
            
    // 获取进程信息对象
    ProcessHandle.Info info = process.info();
    
    String na = "<not available>";
    
    // 打印进程信息
    System.out.printf("Process ID: %s%n", process.pid());
    System.out.printf("Command name: %s%n", info.command().orElse(na));
    System.out.printf("Command line: %s%n", info.commandLine().orElse(na));
            
    // more
    // 阻塞等待进程结束
    process.waitFor();
    
    获取进程输出信息

    使用redirectOutput方法接收进程输出信息:

    ProcessBuilder pb = new ProcessBuilder("ping", "-n", "3", "www.baidu.com") ;
    
    pb .redirectOutput(outFile) .redirectError(Redirect.INHERIT);
         
    
    过滤进程信息

    以下代码演示获取当前用户的进程信息:

        static void filterProcessesTest()
        {
            Optional<String> currUser = ProcessHandle.current().info().user();
    
            ProcessHandle.allProcesses().filter(p1 -> p1.info().user().equals(currUser))
    
                    .sorted(ProcessTest::parentComparator).forEach(ProcessTest::showProcess);
        }
    
        static int parentComparator(ProcessHandle p1, ProcessHandle p2)
        {
            long pid1 = p1.parent().map(ph -> ph.pid()).orElse(-1L);
            long pid2 = p2.parent().map(ph -> ph.pid()).orElse(-1L);
            return Long.compare(pid1, pid2);
        }
    
        static void showProcess(ProcessHandle ph)
        {
            ProcessHandle.Info info = ph.info();
            System.out.printf("pid: %d, user: %s, cmd: %s%n", ph.pid(), info.user().orElse("none"),
                    info.command().orElse("none"));
        }
    
    处理进程终止时回调
    ProcessBuilder pb = new ProcessBuilder("ping", "-n", "3", "www.163.com");
    
    Process process = pb.start();
    
    //
    p.onExit().thenAccept(onExitMethod);
    
    // thenApply 和thenRun类似,函数式lamba表达式
    // thenRun 运行指定的函数,类似于Runnable方式的lamba表达式
    // thenApplyAsyc  异步运行指定的函数通过orkJoinPool.commonPool()
    // get​(long timeout, TimeUnit unit)  等待进程结束,在给定的时间范围内
    // isDone    如果进程已经终止返回true
    
    
    控制对敏感进程信息的访问

    如果应用程序使用SecurityManager类来实现安全策略,那么为了使其能够访问进程信息,安全策略必须授予RuntimePermission(“manageProcess”)。

    Github工程地址

    相关文章

      网友评论

          本文标题:Process API 学习笔记

          本文链接:https://www.haomeiwen.com/subject/cahrmftx.html