Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java9でProcessAPIを使用してプロセスを終了/破棄するにはどうすればよいですか?


Java 9では、プロセスAPI プロセスに関する多くの情報を取得する簡単な方法をサポートします。 ProcessHandle インターフェイスは、ネイティブプロセスとメソッドの制御を識別して提供し、プロセスの活性をチェックしてプロセスを破棄できますが、 ProcessHandle.Info インターフェイスは、プロセスの情報スナップショットを提供できます。 destroy()を使用してプロセスを破棄する必要があります ProcessHandleのメソッド インターフェイス。

以下の例では、 ProcessHandleを使用してプロセスを終了する必要があります インターフェイス。

import java.io.File;
import java.io.IOException;
import java.util.Objects;

public class DestroyProcessTest {
   public static void main(String[] args) throws InterruptedException {
      System.out.println("---------------------------");
      System.out.println("Destroy Process:");

      final String javaCmd = getJavaCmdFromParent();
      final String classpath = getClassPathFromParent();

      try {
         final Process process = new ProcessBuilder(javaCmd, "-cp", classpath, DestroyProcessTest.class.getName()).start();
         ProcessHandle processHandle = process.toHandle();
         printInfo(processHandle);
         destroyProcess(processHandle);

         Thread.sleep(1000);
         System.out.println("---------------------------");
         System.out.println("After destroying the process:");
         printInfo(processHandle);

      } catch(IOException e) {
         e.printStackTrace();
      }
   }
   private static String getClassPathFromParent() {
      return System.getProperty("java.class.path", "./*");
   }
   private static String getJavaCmdFromParent() {
      return Objects.isNull(System.getProperty("java.home")) ? "java"
: String.format("%s%sbin%sjava", System.getProperty("java.home"), File.separator, File.separator);
   }
   private static void destroyProcess(ProcessHandle processHandle) throws IllegalStateException {
      System.out.println("Ready to destroy Process with id: " + processHandle.pid());
      processHandle.destroy();
   }
   private static void printInfo(ProcessHandle processHandle) {
      System.out.println("---------");
      System.out.println("Id: " + processHandle.pid());
      System.out.println("isAlive(): " + processHandle.isAlive());
      System.out.println("isSupportsNormalTermination(): " + processHandle.supportsNormalTermination());

      ProcessHandle.Info processInfo = processHandle.info();
      System.out.println("Info: " + processInfo.toString());
      System.out.println("Info arguments().isPresent(): " + processInfo.arguments().isPresent());
      System.out.println("Info command().isPresent(): " + processInfo.command().isPresent());
      System.out.println("Info totalCpuDuration().isPresent(): " + processInfo.totalCpuDuration().isPresent());
      System.out.println("Info user().isPresent(): " + processInfo.user().isPresent());
   }
}

出力

---------------------------
Destroy Process:
---------
Id: 4384
isAlive(): true
isSupportsNormalTermination(): false
Info: [user: Optional[Tutorialspoint\User], cmd: C:\Program Files\Java\jdk-9.0.4\bin\java.exe, startTime: Optional[2020-03-06T10:58:53.210Z], totalTime: Optional[PT0.046875S]]
Info arguments().isPresent(): false
Info command().isPresent(): true
Info totalCpuDuration().isPresent(): true
Info user().isPresent(): true
Ready to destroy Process with id: 4384
---------------------------
After destroying the process:
---------
Id: 4384
isAlive(): false
isSupportsNormalTermination(): false
Info: [user: Optional[Tutorialspoint\User], startTime: Optional[2020-03-06T10:58:53.210Z], totalTime: Optional[PT0.109375S]]
Info arguments().isPresent(): false
Info command().isPresent(): false
Info totalCpuDuration().isPresent(): true
Info user().isPresent(): true

  1. Java9でProcessAPIに関する情報のスナップショットを取得するにはどうすればよいですか?

    Java 9 プロセスAPIが改善されました 新しいメソッドを組み込み、新しいインターフェイスを導入することにより ProcessHandle およびProcessHandle.Info プロセスとその情報に関するすべての詳細を取得します。 ProcessHandle インターフェイスは、ネイティブプロセスを識別して制御できます。個々のプロセスは、活性を監視できます。 、その子供をリストしました 、プロセスに関する情報を取得するか、破棄 それ。 ProcessHandle.Info インターフェースは情報を提供しますスナップショット プロセスについて。 構文 ProcessHan

  2. Java 9でProcessBuilderを使用してプロセスを作成するにはどうすればよいですか?

    Java 9 ProcessHandleを追加しました プロセスAPIへのインターフェース プロセスクラスを強化します。 ProcessHandleインターフェースのインスタンスは、プロセスのステータスを照会できるようにするローカルプロセスを識別します プロセスの管理と管理、および ProcessHandle.Info PID を取得する必要があるため、ローカルコードを使用できます ローカルプロセスの。 ProcessBuilder クラスを使用して、個別のオペレーティングシステムプロセスを作成できます。以下の例では、「メモ帳」のプロセスを作成できます。 ProcessBuil