Java 9: ​​Verwenden Sie die Prozess-API, um Prozessinformationen abzurufen

Da sich jeder auf Java 8 konzentriert, möchte ich Sie durch einige der Funktionen führen Java 9. Da Java 9 kontinuierlich weiterentwickelt wird, können sich die hier besprochenen Funktionen vor der endgültigen Veröffentlichung von JDK 9 ändern.

Ein paar Links zum Einstieg:

  • In diesem Beitrag verwende ich Java 9 Build b75, heruntergeladen von Hier.
  • Die Javadocs für Java 9 finden Sie hier Hier.
  • Prozess-API

    Die Details der Process API-Updates finden Sie hier Hier auf der offiziellen Projektseite. In diesem Beitrag zeige ich Ihnen, wie Sie:

    Prozess-API in Java 9

  • Drucken Sie Details des aktuellen Prozesses, z. B. des JVM-Prozesses
  • Drucken Sie die Details aller im System ausgeführten Prozesse aus
  • Drucken Sie die Details des neu erstellten Prozesses aus
  • Eine neue Java-Klasse mit Namen ProcessHandle eingeführt, das wie folgt beschrieben wird:

    ProcessHandle Identifiziert und steuert native Prozesse. Jeder einzelne Prozess kann auf Lebendigkeit überwacht, seine untergeordneten Prozesse aufgelistet, Informationen über den Prozess abgerufen oder zerstört werden.

    Der Process Die Klasse wurde um die zu erhaltenden Prozess-APIs erweitert ProcessHandle für diesen Prozess, um die Prozessinformationen abzurufen, um die Prozess-ID abzurufen.

    Im folgenden Beitrag werde ich die folgende Dienstprogrammmethode verwenden, um die Prozessinformationen auszudrucken. ProcessHandle Klasse bietet info() Methode, die eine Instanz von zurückgibt ProcessHandle.Infodiese Instanz kann verwendet werden, um die folgenden Details abzurufen:

    • Ausführbarer Pfadname für den Prozess.
    • Argumente, falls vorhanden, im Prozess.
    • Startzeit des Prozesses.
    • Gesamt-CPU-Zeit des Prozesses.
    • Benutzer des Prozesses.
    //The code for utility class
    import java.time.Instant;
    import java.time.Duration;
    import java.time.temporal.ChronoUnit;
    
    public class ProcessAPIDemoUtil{
      public static void printProcessDetails(ProcessHandle currentProcess){
        //Get the instance of process info
        ProcessHandle.Info currentProcessInfo = currentProcess.info();
        if ( currentProcessInfo.command().orElse("").equals("")){
          return;
        }
        //Get the process id
        System.out.println("Process id: " + currentProcess.getPid());
        //Get the command pathname of the process
        System.out.println("Command: " + currentProcessInfo.command().orElse(""));
        //Get the arguments of the process
        String[] arguments = currentProcessInfo.arguments().orElse(new String[]{});
        if ( arguments.length != 0){
          System.out.print("Arguments: ");
          for(String arg : arguments){
            System.out.print(arg + " ");
          }
          System.out.println();
        }
        //Get the start time of the process
        System.out.println("Started at: " + currentProcessInfo.startInstant().orElse(Instant.now()).toString());
        //Get the time the process ran for
        System.out.println("Ran for: " + currentProcessInfo.totalCpuDuration().orElse(Duration.ofMillis(0)).toMillis() + "ms");
        //Get the owner of the process
        System.out.println("Owner: " + currentProcessInfo.user().orElse(""));
      }
    }
    

    Drucken Sie Details des aktuellen Prozesses, z. B. des JVM-Prozesses

    Der ProcessHandle Die Klasse stellt eine API bereit current() um das aktuelle Prozesshandle zu erhalten. Dieser aktuelle Prozess ist nichts anderes als der JVM-Prozess, der den Java-Code ausführt. Der folgende Code ruft den aktuellen Prozess ab und druckt seine Details mithilfe der oben genannten Dienstprogrammmethode:

    public class CurrentProcessDemo{
      public static void main(String[] args){
        //Get the handle for current process i.e the JVM process
        ProcessHandle currentProcess = ProcessHandle.current();
        System.out.println("**** Current process info ****");
        ProcessAPIDemoUtil.printProcessDetails(currentProcess);
      }
    }
    

    Die Ausgabe des obigen Codes ist:

    G:\java9>javac CurrentProcessDemo.java
    
    G:\java9>java CurrentProcessDemo
    **** Current process info ****
    Process id: 8896
    Command: C:\Program Files\Java\jdk1.9.0\bin\java.exe
    Started at: 2015-08-08T14:08:06.756Z
    Ran for: 187ms
    Owner: SANA-LAPTOP\Mohamed
    

    Drucken Sie die Details aller im System ausgeführten Prozesse aus

    Der ProcessHandle Die Klasse stellt eine API bereit allProcesses() um alle aktiven Prozesse im System zum Laufen zu bringen. Da viele Prozesse zurückgegeben werden, werde ich diejenigen herausfiltern, denen kein Befehl zugeordnet ist, und die Ergebnisse auf 3 beschränken. Nachfolgend finden Sie den Code zum Abrufen der Prozesse:

    public class GetAllProcessesDemo{
      public static void main(String[] args){
        //list atmost 5 processes running in the system which have some command
        ProcessHandle.allProcesses()
          .filter(processHandle -> processHandle.info().command().isPresent())
          .limit(3)
          .forEach((process) ->{
            ProcessAPIDemoUtil.printProcessDetails(process);
          });
      }
    }
    

    Die Ausgabe für den obigen Code:

    G:\java9>javac GetAllProcessesDemo.java
    
    G:\java9>java GetAllProcessesDemo
    Process id: 4524
    Command: C:\Windows\System32\taskhostw.exe
    Started at: 2015-08-04T12:19:49.342Z
    Ran for: 10609ms
    Owner: SANA-LAPTOP\Mohamed
    Process id: 4540
    Command: C:\Windows\System32\sihost.exe
    Started at: 2015-08-04T12:19:49.364Z
    Ran for: 67125ms
    Owner: SANA-LAPTOP\Mohamed
    Process id: 4560
    Command: C:\Program Files\Synaptics\SynTP\SynTPEnh.exe
    Started at: 2015-08-04T12:19:49.449Z
    Ran for: 852609ms
    Owner: SANA-LAPTOP\Mohamed
    
    G:\java9>
    

    Drucken Sie die Details des neu erstellten Prozesses aus

    Der Process Die Klasse wurde um APIs erweitert, um Prozessinformationen, Prozess-IDs usw. abzurufen ProcessHandle für diesen Prozess. Unten finden Sie den Code, um die Details des neu erstellten Prozesses abzurufen:

    import java.io.IOException;
    import java.io.*;
    import java.util.*;
    
    public class NewProcessDetailDemo{
      public static void main(String[] args) throws IOException{
        //Create a new process
        Process process = Runtime.getRuntime().exec("cmd /k dir");
        System.out.println("**** Process details for created process ****");
        //now print this process details
        ProcessAPIDemoUtil.printProcessDetails(process.toHandle());
        Scanner reader = new Scanner(process.getInputStream());
        while(reader.hasNext()){
          System.out.println(reader.nextLine());
        }
    
        reader.close();
      }
    }
    

    Die Ausgabe des obigen Codes ist:

    
    G:\java9>javac NewProcessDetailDemo.java
    
    G:\java9>java NewProcessDetailDemo
    **** Process details for created process ****
    Process id: 7532
    Command: C:\Windows\System32\cmd.exe
    Started at: 2015-08-08T14:39:06.148Z
    Ran for: 0ms
    Owner: SANA-LAPTOP\Mohamed
     Volume in drive G is Development Base
     Volume Serial Number is 9E68-AF66
    
     Directory of G:\java9
    
    08/07/2015  08:13 PM    <DIR>          .
    08/07/2015  08:13 PM    <DIR>          ..
    08/08/2015  07:38 PM               642 CurrentProcessDemo.class
    08/07/2015  07:33 PM               321 CurrentProcessDemo.java
    08/08/2015  07:42 PM             1,717 GetAllProcessesDemo.class
    08/08/2015  07:42 PM               378 GetAllProcessesDemo.java
    08/07/2015  02:33 PM               427 HelloWorld.class
    08/07/2015  02:33 PM               114 HelloWorld.java
    08/08/2015  08:09 PM             1,144 NewProcessDetailDemo.class
    08/08/2015  08:09 PM               595 NewProcessDetailDemo.java
    08/07/2015  06:47 PM             3,191 ProcessAPIDemo.class
    08/07/2015  08:12 PM             1,099 ProcessAPIDemo.java
    08/08/2015  07:38 PM             1,845 ProcessAPIDemoUtil.class
    08/08/2015  07:32 PM             1,333 ProcessAPIDemoUtil.java
                  12 File(s)         12,806 bytes
                   2 Dir(s)  110,687,162,368 bytes free
    

    Damit habe ich Ihnen gezeigt, wie wir mithilfe der neuen APIs in Java 9 Prozessinformationen erhalten können. In den kommenden Beiträgen werde ich weitere Funktionen von Java 9 erkunden, also bleiben Sie dran. Wenn Sie Feedback haben, schreiben Sie es bitte in den Kommentarbereich.

    Kommentar verfassen

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    Nach oben scrollen