Sprievodca rozhraním java.lang.Process API

1. Úvod

V tejto príručke sa chystáme podrobný pohľad na Proces API.

Pre plytšie preskúmanie spôsobu použitia Proces na vykonanie príkazu shellu si môžeme pozrieť náš predchádzajúci tutoriál tu.

Proces, na ktorý sa odvoláva, je spustená aplikácia. The Proces trieda poskytuje metódy interakcie s týmito procesmi vrátane extrakcie výstupu, vykonávania vstupu, monitorovania životného cyklu, kontroly stavu ukončenia a jeho zničenia (zabitia).

2. Pomocou Proces Trieda pre kompiláciu a spustenie programu Java

Pozrime sa na príklad kompilácie a spustenia iného Java programu pomocou Proces API:

@Test public void whenExecutedFromAnotherProgram_thenSourceProgramOutput3 () vyvolá IOException {Process process = Runtime.getRuntime () .exec ("javac -cp src src \ main \ java \ com \ baeldung \ java9 \ process \ OutputStreamExample.java "); process = Runtime.getRuntime () .exec ("java -cp src / main / java com.baeldung.java9.process.OutputStreamExample"); Výstup BufferedReader = nový BufferedReader (nový InputStreamReader (process.getInputStream ())); int hodnota = Integer.parseInt (output.readLine ()); assertEquals (3, hodnota); }

Aplikácie na vykonávanie kódu Java v rámci existujúceho kódu Java sú teda prakticky neobmedzené.

3. Proces vytvárania

Naša aplikácia Java môže vyvolať akúkoľvek aplikáciu, ktorá je spustená v našom počítačovom systéme, s výhradou obmedzenia operačného systému.

Preto môžeme vykonávať aplikácie. Pozrime sa, aké sú rôzne prípady použitia, ktoré môžeme spustiť s využitím Process API.

The ProcessBuilder trieda nám umožňuje vytvárať podprocesy v rámci našej aplikácie.

Pozrime sa na ukážku otvorenia aplikácie Poznámkový blok so systémom Windows:

ProcessBuilder builder = nový ProcessBuilder ("notepad.exe"); Proces proces = builder.start ();

4. Proces ničenia

Proces tiež nám poskytuje metódy na zničenie čiastkových procesov alebo procesov. To, ako je aplikácia zabitá, však závisí od platformy.

Pozrime sa na rôzne prípady použitia, ktoré sú možné.

4.1. Zničenie procesu referenciou

Povedzme, že používame operačný systém Windows a chceme spustiť aplikáciu Poznámkový blok a zničiť ju.

Rovnako ako predtým, môžeme vytvoriť inštanciu aplikácie Poznámkový blok pomocou ProcessBuilder triedy a štart () metóda.

Potom môžeme zavolať zničiť () metóda na našom Proces objekt.

4.2. Zničenie procesu podľa ID

Môžeme tiež zabiť procesy, ktoré bežia v našom operačnom systéme a ktoré by naša aplikácia nemohla vytvoriť.

Pri tom by ste mali byť opatrní, pretože môžeme nevedomky zničiť kritický proces, ktorý by mohol spôsobiť nestabilitu operačného systému..

Najprv musíme zistiť ID procesu aktuálne bežiaceho procesu kontrolou správcu úloh a zistením pid.

Pozrime sa na príklad:

Voliteľné nepovinnéProcessHandle = ProcessHandle.of (5232); optionalProcessHandle.ifPresent (processHandle -> processHandle.destroy ()); 

4.3. Násilné zničenie procesu

O poprave zničiť () metódou sa podproces zabije, ako sme videli predtým v článku.

V prípade kedy zničiť () nefunguje, máme možnosť zničiť násilne ().

Mali by sme vždy začínať zničiť () metóda ako prvá. Potom môžeme vykonať rýchlu kontrolu podprocesu, či už vykonaním je nažive().

Ak sa vráti pravda, vykonajte zničiť násilne ():

ProcessBuilder builder = nový ProcessBuilder ("notepad.exe"); Proces proces = builder.start (); process.destroy (); if (process.isAlive ()) {process.destroyForcibly (); }

5. Čakanie na dokončenie procesu

Máme tiež dve preťažené metódy, pomocou ktorých môžeme zaistiť, že môžeme počkať na dokončenie procesu.

5.1. čakať na()

Po vykonaní tejto metódy sa umiestni súčasné vlákno procesu vykonávania v stave blokovania čakania, pokiaľ nebude podproces ukončený.

Pozrime sa na príklad:

ProcessBuilder builder = nový ProcessBuilder ("notepad.exe"); Proces proces = builder.start (); assertThat (process.waitFor ()> = 0); 

Z vyššie uvedeného príkladu vidíme, že súčasné vlákno bude pokračovať vo vykonávaní, bude čakať na ukončenie vlákna podprocesu. Po ukončení podprocesu bude súčasné vlákno pokračovať vo vykonávaní.

5.2. waitfor (long timeOut, TimeUnit time)

Po vykonaní tejto metódy sa umiestni aktuálne vlákno aktuálneho procesu vykonávania v stave blokovania čakania, pokiaľ sa podproces nezruší alebo mu nedôjde čas.

Pozrime sa na príklad:

ProcessBuilder builder = nový ProcessBuilder ("notepad.exe"); Proces proces = builder.start (); assertFalse (process.waitFor (1, TimeUnit.SECONDS));

Z vyššie uvedeného príkladu vidíme, že súčasné vlákno bude pokračovať vo vykonávaní, bude čakať na ukončenie vlákna podprocesu alebo ak uplynul zadaný časový interval.

Keď je táto metóda vykonaná, vráti boolovskú hodnotu true, ak bol podproces ukončený, alebo boolovskú hodnotu false, ak pred ukončením podprocesu uplynul čas čakania.

6. exitValue ()

Keď je táto metóda spustená, súčasné vlákno nebude čakať na ukončenie alebo zničenie podprocesu, vyhodí však IllegalThreadStateException ak nie je podproces ukončený.

Pokiaľ je podproces úspešne ukončený, bude to mať za následok výstupnú hodnotu procesu.

Môže to byť akékoľvek možné kladné celé číslo.

Pozrime sa na príklad, keď exitValue () metóda vráti kladné celé číslo, keď bol podproces úspešne ukončený:

@Test public void givenSubProcess_whenCurrentThreadWillNotWaitIndefinitelyforSubProcessToEnd_thenProcessExitValueReturnsGrt0 () vyvolá IOException {ProcessBuilder builder = nový ProcessBuilder ("notepad.exe"); Proces proces = builder.start (); assertThat (process.exitValue ()> = 0); }

7. je nažive()

Kedy by sme chceli vykonať podnikové spracovanie, ktoré je subjektívne, či už je proces nažive alebo nie.

Môžeme vykonať rýchlu kontrolu a zistiť, či je proces nažive alebo nie, čím sa vráti logická hodnota.

Pozrime sa na krátky príklad:

ProcessBuilder builder = nový ProcessBuilder ("notepad.exe"); Proces proces = builder.start (); Závit. Spánok (10 000); process.destroy (); assertTrue (process.isAlive ());

8. Spracovanie procesných prúdov

Vytvorený podproces štandardne nemá svoj terminál alebo konzolu. Všetky jeho štandardné vstupno-výstupné operácie (t. J. Stdin, stdout, stderr) sa odošlú nadradenému procesu. Týmto môže nadradený proces použiť tieto prúdy na napájanie vstupu do a na výstup z podprocesu.

V dôsledku toho nám to dáva obrovskú flexibilitu, pretože nám dáva kontrolu nad vstupom / výstupom nášho čiastkového procesu.

8.1. getErrorStream ()

Je zaujímavé, že môžeme načítať chyby generované z podprocesu a na ňom vykonávať obchodné spracovanie.

Potom môžeme na základe našich požiadaviek vykonať konkrétne kontroly podnikového spracovania.

Pozrime sa na príklad:

@ Test public void givenSubProcess_whenEncounterError_thenErrorStreamNotNull () vyvolá IOException {Process process = Runtime.getRuntime (). Exec ("javac -cp src src \ main \ java \ com \ baeldung \ java9 \ process \ ProcessCompilationEditor "); Chyba BufferedReader = nový BufferedReader (nový InputStreamReader (process.getErrorStream ())); Reťazec errorString = error.readLine (); assertNotNull (errorString); }

8.2. getInputStream ()

Môžeme tiež načítať výstup generovaný podprocesom a spotrebovať ho v nadradenom procese, čo umožňuje zdieľanie informácií medzi procesmi:

@Test public void givenSourceProgram_whenReadingInputStream_thenFirstLineEquals3 () vyvolá IOException {Process process = Runtime.getRuntime (). Exec ("javac -cp src src \ main \ java \ com \ baeldung \ java9 \ process \ OutputStreamExam "); process = Runtime.getRuntime () .exec ("java -cp src / main / java com.baeldung.java9.process.OutputStreamExample"); Výstup BufferedReader = nový BufferedReader (nový InputStreamReader (process.getInputStream ())); int hodnota = Integer.parseInt (output.readLine ()); assertEquals (3, hodnota); }

8.3. getOutputStream ()

Môžeme poslať vstup do podprocesu z nadradeného procesu:

Zapisovač w = nový OutputStreamWriter (process.getOutputStream (), "UTF-8"); w.write ("poslať dieťaťu \ n");

8.4. Filtrovať prúdy procesu

Je to úplne platný prípad použitia na interakciu so selektívnymi bežiacimi procesmi.

Proces nám poskytuje zariadenie na selektívne filtrovanie bežiacich procesov na základe určitého predikátu.

Potom môžeme vykonávať obchodné operácie na tejto skupine selektívnych procesov:

@Test public void givenRunningProcesses_whenFilterOnProcessIdRange_thenGetSelectedProcessPid () {assertThat (((int) ProcessHandle.allProcesses () .filter (ph -> (ph.pid ()> 10 000 && ph.pid () 0);}

9. Záver

Proces je výkonná trieda pre interakciu na úrovni operačného systému. Spúšťanie príkazov terminálu, ako aj spúšťanie, monitorovanie a zabíjanie aplikácií.

Ak sa chcete dozvedieť viac o rozhraní Java 9 Process API, pozrite si náš článok tu.

Ako vždy, zdroje nájdete na Githube.


$config[zx-auto] not found$config[zx-overlay] not found