JDK1.8源码学习--lang包(Process)

前言


月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)

央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)

泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)

月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容

希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
 

一.Process的作用:

         直接看源码注释(我的翻译可能不太准,如果道友们有更棒的理解,可以留言或者私信)

/**
 * The {@link ProcessBuilder#start()} and
 * {@link Runtime#exec(String[],String[],File) Runtime.exec}
 * methods create a native process and return an instance of a
 * subclass of {@code Process} that can be used to control the process
 * and obtain information about it.  The class {@code Process}
 * provides methods for performing input from the process, performing
 * output to the process, waiting for the process to complete,
 * checking the exit status of the process, and destroying (killing)
 * the process.
 * 1. ProcessBuilder.start()和 Runtime.exec(String[],String[],File)
 * 方法创建本机进程并返回可以使用的Process子类的实例控制过程并获取有关它的信息。
 * Process类提供了执行进程输入、执行输出到进程、等待进程完成、检查进程退出状态以及销毁(杀死)进程的方法
 * <p>The methods that create processes may not work well for special
 * processes on certain native platforms, such as native windowing
 * processes, daemon processes, Win16/DOS processes on Microsoft
 * Windows, or shell scripts.
 * 2.创建进程的方法可能不适用于某些原生平台上的特殊进程,
 * 例如原生窗口进程、守护进程、Microsoft Windows 上的 Win16DOS 进程或 shell 脚本。
 * <p>By default, the created subprocess does not have its own terminal
 * or console.  All its standard I/O (i.e. stdin, stdout, stderr)
 * operations will be redirected to the parent process, where they can
 * be accessed via the streams obtained using the methods
 * {@link #getOutputStream()},
 * {@link #getInputStream()}, and
 * {@link #getErrorStream()}.
 * The parent process uses these streams to feed input to and get output
 * from the subprocess.  Because some native platforms only provide
 * limited buffer size for standard input and output streams, failure
 * to promptly write the input stream or read the output stream of
 * the subprocess may cause the subprocess to block, or even deadlock.
 * 3.默认情况下,创建的子进程没有自己的终端或控制台。
 * 它的所有标准 IO(即 stdin、stdout、stderr)操作都将被重定向到父进程,
 * 在那里可以通过使用 getOutputStream()、getInputStream()和 getErrorStream()。
 * 父进程使用这些流向子进程提供输入和从子进程获取输出。由于一些原生平台只为标准输入输出流提供有限的缓冲区大小,
 * 如果不能及时写入输入流或读取子进程的输出流,可能会导致子进程阻塞,甚至死锁
 * <p>Where desired, <a href="ProcessBuilder.html#redirect-input">
 * subprocess I/O can also be redirected</a>
 * using methods of the {@link ProcessBuilder} class.
 * 4.如果需要,子进程 IO 也可以使用ProcessBuilder类的方法重定向
 * <p>The subprocess is not killed when there are no more references to
 * the {@code Process} object, but rather the subprocess
 * continues executing asynchronously.
 * 5.当没有更多对 Process对象的引用时,子进程不会被终止,而是子进程继续异步执行。
 * <p>There is no requirement that a process represented by a {@code
 * Process} object execute asynchronously or concurrently with respect
 * to the Java process that owns the {@code Process} object.
 * 6.不要求由Process对象表示的进程与拥有Process对象的 Java 进程异步或并发执行
 * <p>As of 1.5, {@link ProcessBuilder#start()} is the preferred way
 * to create a {@code Process}.
*7.从 1.5 开始,ProcessBuilder.start()是创建 Process的首选方式
 * @since   JDK1.0
 */

二.内部方法: 

                getOutputStream()

   /**
     * 1.返回连接到子进程的正常输入的输出流。流的输出通过管道传输到此 Process对象表示的进程的标准输入中
     * 2.如果子流程的标准输入已使用 ProcessBuilder.redirectInput(Redirect)重定向,
     * 则此方法将返回空输出流。

     * 3.实现说明:将返回的输出流缓冲是一个好主意。
     */
    public abstract OutputStream getOutputStream();

                getInputStream

    /**
     * 1.返回连接到子进程正常输出的输入流。该流从由该Process对象表示的进程的标准输出中获取管道数据。
     * 2.如果子流程的标准输出已使用ProcessBuilder.redirectOutput(Redirect)重定向,
     * 则此方法将返回 空输入流。

     * 3否则,如果子进程的标准错误已经使用 ProcessBuilder.redirectErrorStream(boolean) 重定向,
     * 则此方法返回的输入流将接收合并的标准输出和子进程的标准错误。

     * 4.实现说明:对返回的输入流进行缓冲是个好主意

     */
    public abstract InputStream getInputStream();

                getErrorStream

    /**
     * 1.返回连接到子进程错误输出的输入流。该流从该 Process对象表示的进程的错误输出中获取管道数据。
     * 2.如果子流程的标准错误已使用ProcessBuilder.redirectError(Redirect)
     * 3.实现说明:对返回的输入流进行缓冲是个好主意
     */
    public abstract InputStream getErrorStream();

                waitFor

   /**
     * 1.如有必要,使当前线程等待,直到此Process对象表示的进程终止。如果子进程已经终止,
     * 则此方法立即返回。如果子进程尚未终止,调用线程将被阻塞,直到子进程退出
     */
    public abstract int waitFor() throws InterruptedException;

    /**
     * 1.使当前线程在必要时等待,直到此Process对象表示的子进程终止,或指定的等待时间过去
     * 2.如果子进程已经终止,则此方法立即返回值true。如果进程尚未终止且超时值小于或等于零,则此方法立即返回值false
     * 3.此方法的默认实现轮询 exitValue以检查进程是否已终止。强烈鼓励此类的具体实现以更有效的实现覆盖此方法。
     */
    public boolean waitFor(long timeout, TimeUnit unit)
        throws InterruptedException
    {
        long startTime = System.nanoTime();
        long rem = unit.toNanos(timeout);

        do {
            try {
                exitValue();
                return true;
            } catch(IllegalThreadStateException ex) {
                if (rem > 0)
                    Thread.sleep(
                        Math.min(TimeUnit.NANOSECONDS.toMillis(rem) + 1, 100));
            }
            rem = unit.toNanos(timeout) - (System.nanoTime() - startTime);
        } while (rem > 0);
        return false;
    }

                exitValue

    /**
     * 返回子进程的退出值
     */
    public abstract int exitValue();

                destroy

    /**
     * 杀死子进程。此Process对象表示的子进程是否被强制终止取决于实现。
     */
    public abstract void destroy();

    /**
     * 1.杀死子进程。这个 Process对象所代表的子进程被强行终止
     * 2.此方法的默认实现调用destroy,因此可能不会强制终止进程。强烈鼓励此类的具体实现使用兼容实现覆盖此方法。
     * 在  ProcessBuilder.start和 Runtime.exec返回的Process对象上调用此方法将强制终止进程。
     * 3.注意:子进程可能不会立即终止。即isAlive()可能会在调用destroyForcibly()后的短时间内返回 true。
     * 如果需要,此方法可以链接到 waitFor()。
     */
    public Process destroyForcibly() {
        destroy();
        return this;
    }

                isAlive

 /**
     * 测试此 Process表示的子进程是否处于活动状态
     */
    public boolean isAlive() {
        try {
            exitValue();
            return false;
        } catch(IllegalThreadStateException e) {
            return true;
        }
    }

三.总结

        大家知道什么是进程,线程,纤程吗....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值