Module java.base
Package java.lang

Interface ProcessHandle

所有超级接口:
Comparable<ProcessHandle>

public interface ProcessHandle extends Comparable<ProcessHandle>
ProcessHandle标识并提供对本机进程的控制。每个单独的进程可以被监视其活动性,列出其子进程,获取有关该进程的信息或销毁它。相比之下,Process实例是由当前进程启动的,此外还提供对进程输入、输出和错误流的访问。

本机进程ID是操作系统分配给进程的标识号。进程ID值的范围取决于操作系统。例如,嵌入式系统可能使用16位值。有关进程的状态信息是从本机系统检索的,可能会异步更改;进程可能会被创建或自动终止。进程终止后到进程ID被用于新进程之间的时间是不可预测的。在使用ProcessHandles时,避免对底层进程的活动性或标识做出假设。

每个ProcessHandle标识并允许控制本机系统中的一个进程。ProcessHandles是从工厂方法current()of(long)children()descendants()parent()allProcesses()返回的。

ProcessBuilder创建的Process实例可以查询提供有关该进程的信息的ProcessHandle。ProcessHandle引用不应该被随意分发。

onExit()获得的CompletableFuture可用于等待进程终止,并可能触发依赖动作。

工厂方法通过检查RuntimePermission("manageProcess")的SecurityManager来限制对ProcessHandles的访问。控制进程的能力也受到本机系统的限制,ProcessHandle对本机进程的访问或控制不会超出本机应用程序允许的范围。

实现要求:
在无法支持ProcessHandles的情况下,工厂方法必须始终抛出UnsupportedOperationException。如果操作系统不允许访问查询或终止进程,则此类的方法会抛出UnsupportedOperationException

ProcessHandle静态工厂方法返回的实例是基于值的、不可变的和线程安全的。程序员应该将相等的实例视为可互换的,并且不应该将实例用于同步,否则可能会发生不可预测的行为。例如,在将来的版本中,同步可能会失败。使用equalscompareTo方法来比较ProcessHandles。

自版本:
9
参见:
  • Method Details

    • pid

      long pid()
      返回进程的本机进程ID。本机进程ID是操作系统分配给进程的标识号。操作系统可能在进程终止后重新使用进程ID。使用equalscompareTo来比较ProcessHandles。
      返回:
      进程的本机进程ID
      抛出:
      UnsupportedOperationException - 如果实现不支持此操作
    • of

      static Optional<ProcessHandle> of(long pid)
      返回现有本机进程的Optional<ProcessHandle>
      参数:
      pid - 本机进程ID
      返回:
      进程的PID的Optional<ProcessHandle>;如果进程不存在,则Optional为空
      抛出:
      SecurityException - 如果已安装安全管理器并且拒绝了RuntimePermission("manageProcess")
      UnsupportedOperationException - 如果实现不支持此操作
    • current

      static ProcessHandle current()
      返回当前进程的ProcessHandle。ProcessHandle不能用于销毁当前进程,应该使用System.exit
      返回:
      当前进程的ProcessHandle
      抛出:
      SecurityException - 如果已安装安全管理器并且拒绝了RuntimePermission("manageProcess")
      UnsupportedOperationException - 如果实现不支持此操作
    • parent

      Optional<ProcessHandle> parent()
      返回父进程的Optional<ProcessHandle>。请注意,处于僵尸状态的进程通常没有父进程。
      返回:
      父进程的Optional<ProcessHandle>;如果子进程没有父进程或父进程不可用(可能由于操作系统限制),则Optional为空
      抛出:
      SecurityException - 如果已安装安全管理器并且拒绝了RuntimePermission("manageProcess")
    • children

      Stream<ProcessHandle> children()
      返回当前进程的直接子进程的快照。直接子进程的parent()是该进程。通常,一个未活动的进程没有子进程。

      请注意,进程是异步创建和终止的。不能保证进程是活动的。

      返回:
      一个顺序的ProcessHandles流,用于表示该进程的直接子进程
      抛出:
      SecurityException - 如果已安装安全管理器并且拒绝了RuntimePermission("manageProcess")
    • descendants

      Stream<ProcessHandle> descendants()
      返回进程的后代的快照。进程的后代是该进程的子进程加上这些子进程的后代,递归地。通常,一个未活动的进程没有子进程。

      请注意,进程是异步创建和终止的。不能保证进程是活动的。

      返回:
      一个顺序的ProcessHandles流,用于表示该进程的后代
      抛出:
      SecurityException - 如果已安装安全管理器并且拒绝了RuntimePermission("manageProcess")
    • allProcesses

      static Stream<ProcessHandle> allProcesses()
      返回当前进程可见的所有进程的快照。

      请注意,进程是异步创建和终止的。不能保证流中的进程是活动的,也不能保证自快照创建以来没有创建其他进程。

      返回:
      用于所有进程的ProcessHandles流
      抛出:
      SecurityException - 如果已安装安全管理器并且拒绝了RuntimePermission("manageProcess")
      UnsupportedOperationException - 如果实现不支持此操作
    • info

      返回有关进程的信息的快照。

      ProcessHandle.Info实例具有访问器方法,如果可用,则返回有关进程的信息。

      返回:
      有关进程的信息的快照,始终非空
    • onExit

      返回一个CompletableFuture<ProcessHandle>,用于处理进程的终止。 CompletableFuture提供了在进程终止时触发依赖函数或操作的能力,这些函数或操作可以同步或异步运行。当进程终止时,CompletableFuture会被完成,无论进程的退出状态如何。可以多次调用onExit方法来在进程退出时调用独立的操作。

      调用onExit().get()会等待进程终止并返回ProcessHandle。可以使用future来检查进程是否完成,或者等待进程终止。取消CompletableFuture不会影响进程。

      API注释:
      在CompletableFuture完成和依赖操作被调用之前,可能会观察到进程已经终止。
      返回:
      一个新的CompletableFuture<ProcessHandle>用于ProcessHandle
      抛出:
      IllegalStateException - 如果进程是当前进程
    • supportsNormalTermination

      boolean supportsNormalTermination()
      如果destroy()的实现通常终止进程,则返回true。如果destroy的实现强制并立即终止进程,则返回false
      返回:
      如果destroy()的实现通常终止进程,则返回true;否则,destroy()强制终止进程
    • destroy

      boolean destroy()
      请求终止进程。由此ProcessHandle对象表示的进程是否正常终止是依赖于实现的。强制进程销毁被定义为立即终止进程,而正常终止允许进程干净地关闭。如果进程不活动,则不会采取任何操作。操作系统访问控制可能会阻止进程被终止。

      onExit()返回的CompletableFuture在进程终止时被完成

      注意:进程可能不会立即终止。例如,destroy()调用后,isAlive()可能会在短暂时间内返回true。

      返回:
      如果成功请求了终止,则返回true,否则返回false
      抛出:
      IllegalStateException - 如果进程是当前进程
    • destroyForcibly

      boolean destroyForcibly()
      请求强制终止进程。由此ProcessHandle对象表示的进程将被强制终止。强制进程销毁被定义为立即终止进程,而正常终止允许进程干净地关闭。如果进程不活动,则不会采取任何操作。操作系统访问控制可能会阻止进程被终止。

      onExit()返回的CompletableFuture在进程终止时被完成

      注意:进程可能不会立即终止。例如,destroyForcibly()调用后,isAlive()可能会在短暂时间内返回true。

      返回:
      如果成功请求了终止,则返回true,否则返回false
      抛出:
      IllegalStateException - 如果进程是当前进程
    • isAlive

      boolean isAlive()
      测试由此ProcessHandle表示的进程是否活动。进程终止是实现和操作系统特定的。只要PID有效,进程就被认为是活动的。
      返回:
      如果由此ProcessHandle对象表示的进程尚未终止,则返回true
    • hashCode

      int hashCode()
      为此ProcessHandle返回一个哈希码值。哈希码值遵循Object.hashCode()的一般约定。该值是pid()值的函数,可能是用于唯一标识进程的其他信息的函数。如果两个ProcessHandles根据equals方法相等,则在这两个对象上调用hashCode方法必须产生相同的整数结果。
      覆盖:
      hashCode 在类 Object
      返回:
      此对象的哈希码值
      参见:
    • equals

      boolean equals(Object other)
      如果other对象非空,并且是相同实现且表示相同系统进程,则返回true;否则返回false
      覆盖:
      equals 在类 Object
      实现注释:
      对于具有相同PID的ProcessHandles是否表示相同系统进程是特定于实现的。ProcessHandle实现应包含其他信息以唯一标识进程。例如,进程的启动时间可以用于确定PID是否已被重新使用。如果两个具有相同PID的ProcessHandles根据信息无法区分,则equals的实现应返回true
      参数:
      other - 另一个对象
      返回:
      如果other对象非空,并且是相同实现类且表示相同系统进程,则返回true;否则返回false
      参见:
    • compareTo

      int compareTo(ProcessHandle other)
      将此ProcessHandle与指定的ProcessHandle进行比较。顺序未指定,但与Object.equals(java.lang.Object)一致,如果两个ProcessHandle实例是相同实现且表示相同系统进程,则返回true。仅支持同一实现之间的比较。如果尝试相互比较两个不同实现的ProcessHandle,将抛出ClassCastException
      指定者:
      compareTo 在接口 Comparable<ProcessHandle>
      参数:
      other - 要比较的ProcessHandle
      返回:
      如果此对象小于、等于或大于指定对象,则返回负整数、零或正整数。
      抛出:
      NullPointerException - 如果指定对象为null
      ClassCastException - 如果指定对象与此对象不是同一类