java中的Process

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的Process相关的知识,希望对你有一定的参考价值。

java中的Process类是个抽象类,它里面的方法基本都是抽象的。。。。Runtime.exec("notepad")返回一个Process的实例,,为什么可以调用Process的抽象方法???它有子类吗??子类是哪个?

参考技术A Runtime.exec("notepad") 返回的Process实例是基于Process子类,这点无需质疑。
任何成功实例化的对象所属的类都是非抽象的实现类,抽象的方法已被实现。

如果想查找其真实子类,可通过:
System.out.println( Process实例引用.getClass().getName() ); // 详细可参考JAVA反射机制
或着 查源码/Debug 跟踪 Runtime.exec 方法的执行过程。

以上是我告诉你是些常用的技巧,这里根据我看到的源码说说:
Runtime.exec 实际上调用了 java.lang.ProcessBuilder 的实现,不懂的可查 API 文档;
而ProcessBuilder 内部调用 java.lang.ProcessImpl.start(...) 静态方法 返回1个 ProcessImpl实例;
ProcessImpl类 正好是 Process类 的子类。本回答被提问者和网友采纳
参考技术B 说的太模糊,代码是什么追问

   Runtime run = Runtime.getRuntime() ; // 取得Runtime类的实例化对象
Process p = null ; // 定义进程变量
p = run.exec("notepad.exe") ; // 调用本机程序,此方法需要异常处理
p.destroy() ; // 结束此进程

java 582. Kill Process(1st).java

public class Solution {
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        List<Integer> res = new ArrayList<Integer>();
        if (pid == null || ppid == null) return res;
        Map<Integer, List<Integer>> adjList = new HashMap<Integer, List<Integer>>();
        int len = pid.size();
        for (int i = 0; i < len; i++) {
            adjList.putIfAbsent(ppid.get(i), new ArrayList<Integer>());
            adjList.get(ppid.get(i)).add(pid.get(i));
        }
        
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.offer(kill);
        while(!queue.isEmpty()) {
            int cur = queue.poll();
            res.add(cur);
            if (adjList.containsKey(cur)) {
                for (int next : adjList.get(cur)) {
                     queue.offer(next);
                }
            }
        }
        return res;
        
    }
}
public class Solution {
    private void add(HashMap<Integer, List<Integer>> parentVsChild, Set<Integer> res, int kill) {
        res.add(kill);
        List<Integer> children = parentVsChild.get(kill);
        if (children != null) {
            for (Integer val : children) {
                add(parentVsChild, res, val);
            }
        }
    }
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        HashMap<Integer, List<Integer>> parentVsChild = new HashMap<>();

        for (int i = 0; i < ppid.size(); i++) {
            Integer parentId = ppid.get(i);
            if (parentId == 0 && kill == pid.get(i)) {
                return pid;
            }
            List<Integer> children = parentVsChild.get(parentId);
            if (children == null) {
                children = new ArrayList<>();
                parentVsChild.put(parentId, children);
            }
            children.add(pid.get(i));
        }
        Set<Integer> res = new HashSet<>();
        add(parentVsChild, res, kill);
        return new ArrayList<>(res);
    }
}

以上是关于java中的Process的主要内容,如果未能解决你的问题,请参考以下文章

java命令执行漏洞

Java代码启动/关闭进程

java掉系統进程

java代码中执行liunx命令

java调用shell脚本且传递参数

java调用process线程阻塞问题