1. Java 프로세스 생성
Java는 프로세스 또는 기타 프로그램을 시작하는 두 가지 방법을 제공합니다.
(1) runtime의 exec () 메소드 사용 (2) ProcessBuilder 's Start () 메소드 사용 (2)
1.1 ProcessBuilder
ProcessBuilder 클래스는 J2SE 1.5에 의해 새로 추가 된 새로운 클래스입니다. J2SE 1.5 이전에는 프로세스 제어 및 관리가 프로세스 클래스에서 구현되었습니다.
각 ProcessBuilder 인스턴스는 일련의 프로세스 속성을 관리합니다. start () 메소드는 이러한 속성을 사용하여 새 프로세스 인스턴스를 만듭니다. START () 메소드는 동일한 인스턴스에서 반복적으로 호출하여 동일한 또는 관련 특성으로 새 자식 프로세스를 생성 할 수 있습니다.
각 프로세스 생성기는 이러한 프로세스 속성을 관리합니다.
명령은 호출 할 외부 프로그램 파일과 그 매개 변수 (있는 경우)를 나타내는 문자열 목록입니다. 여기서 유효한 운영 체제 명령을 나타내는 문자열 목록은 시스템 종속입니다. 예를 들어, 모든 전체 변수는 일반적 으로이 목록의 요소가되지만 프로그램이 명령 줄 문자열 자체를 표시하려는 운영 체제가 있습니다. 이러한 시스템에서 Java 구현에는이 두 요소를 정확히 포함하도록 명령이 필요할 수 있습니다.
환경은 변수에서 값으로의 시스템 의존적 매핑입니다. 초기 값은 현재 프로세스 환경의 사본입니다 (System.getenv () 참조).
작업 디렉토리. 기본값은 현재 프로세스의 현재 작업 디렉토리이며, 일반적으로 System Property User.Dir에 따라 명명되었습니다.
REDERECTERRORSTREAM 속성. 처음 에이 속성은 False입니다. 즉, 자식 프로세스의 표준 출력 및 오류 출력은 프로세스를 통해 액세스 할 수있는 두 개의 독립 스트림으로 전송됩니다. 값이 true로 설정되면 표준 오류는 표준 출력과 병합됩니다. 이를 통해 오류 메시지와 해당 출력을보다 쉽게 연결할 수 있습니다. 이 경우 병합 된 데이터는 process.getInputStream ()에 의해 리턴 된 스트림에서 읽을 수 있고, stream은 process.getErrorstream ()에서 읽은 스트림이 파일의 끝에 직접 도달합니다.
프로세스 빌더의 속성을 수정하면 객체의 start () 메소드에 의해 시작된 후속 프로세스에 영향을 미치지 만 이전에 시작된 프로세스 또는 Java 자체에 영향을 미치지 않습니다.大多数错误检查由start() 方法执行。可以修改对象的状态,但这样start() 将会失败。例如,将命令属性设置为一个空列表将不会抛出异常,除非包含了start()。
注意,此类不是同步的。 여러 스레드가 프로세스 빌더에 동시에 액세스하고 적어도 하나의 스레드가 속성 중 하나를 구조적으로 수정하면 외부 동기화를 유지해야합니다.
构造方法摘要
ProcessBuilder (list <string> 명령)
지정된 운영 체제 프로그램 및 매개 변수를 사용하여 프로세스 생성기를 구성하십시오.
ProcessBuilder (문자열 ... 명령)
지정된 운영 체제 프로그램 및 매개 변수를 사용하여 프로세스 생성기를 구성하십시오.
방법 요약
List <string> 명령 ()
이 프로세스 생성기의 운영 체제 프로그램 및 매개 변수를 반환합니다.
ProcessBuilder 명령 (list <string> 명령)
이 프로세스 생성기의 운영 체제 프로그램 및 매개 변수를 설정합니다.
ProcessBuilder 명령 (문자열 ... 명령)
이 프로세스 생성기의 운영 체제 프로그램 및 매개 변수를 설정합니다.
파일 디렉토리 ()
이 프로세스 생성기의 작업 디렉토리를 반환합니다.
ProcessBuilder 디렉토리 (파일 디렉토리)
이 프로세스 생성기의 작업 디렉토리를 설정합니다.
지도 <문자열, 문자열> 환경 ()
이 프로세스 생성기 환경의 문자열 매핑보기를 반환합니다.
부울 redirecterrorstream ()
프로세스 생성기에게 표준 오류 및 표준 출력 병합 여부를 알립니다.
ProcessBuilder REDEIRECTERRORSTREAM (부울 REDERECTERRORTREAM)
이 프로세스 생성기의 REDERECTERRORSTREAM 속성을 설정합니다.
프로세스 시작 ()
이 프로세스 생성기의 속성을 사용하여 새 프로세스를 시작하십시오.
1.2 런타임
각 Java 응용 프로그램에는 런타임 클래스 인스턴스가있어 응용 프로그램이 실행되는 환경에 연결할 수 있습니다. 현재 런타임은 getRuntime 방법을 통해 얻을 수 있습니다.
응용 프로그램은 고유 한 런타임 클래스 인스턴스를 만들 수 없습니다. 그러나 getRuntime 메소드를 사용하여 현재 런타임 런타임 개체에 대한 참조를 얻을 수 있습니다. 현재 런타임 객체에 대한 참조를 얻으면 런타임 객체 메소드를 호출하여 Java 가상 머신의 상태 및 동작을 제어 할 수 있습니다.
Java 코드 수집 코드
void addshutdownhook (스레드 후크)
새 가상 머신을 등록하여 후크를 끄십시오.
int availingProcessors ()
사용 가능한 프로세서 수를 Java 가상 머신에 반환합니다.
프로세스 exec (문자열 명령)
별도의 프로세스에서 지정된 문자열 명령을 실행하십시오.
프로세스 exec (String [] cmdarray)
별도의 프로세스에서 지정된 명령 및 변수를 실행하십시오.
프로세스 exec (String [] cmdarray, String [] Envp)
지정된 환경의 별도 프로세스에서 지정된 명령 및 변수를 실행합니다.
Process Exec (String [] Cmdarray, String [] Envp, File Dir)
지정된 환경 및 작업 디렉토리에서 별도의 프로세스에서 지정된 명령 및 변수를 실행하십시오.
Process Exec (String 명령, String [] Envp)
지정된 문자열 명령을 지정된 환경의 별도 프로세스에서 실행하십시오.
Process Exec (String 명령, String [] Envp, File Dir)
지정된 환경 및 작업 디렉토리가있는 별도의 프로세스에서 지정된 문자열 명령을 실행하십시오.
void exit (int status)
가상 머신의 종료 시퀀스를 시작하여 현재 실행중인 Java Virtual Machine을 종료하십시오.
긴 프리 메모리 ()
Java 가상 머신에서 무료 메모리의 양을 반환합니다.
void gc ()
쓰레기 수집가를 실행하십시오.
inputStream getLocalizedInputStream (inputStream in)
쓸모없는. JDK 1.1로 시작하여 로컬 로코딩 된 바이트 스트림을 유니 코드 문자 스트림으로 변환하는 선호하는 방법은 inputStreamReader 및 BufferedReader 클래스를 사용하는 것입니다.
outputStream getLocalizedOutputStream (outputStream out)
쓸모없는. JDK 1.1부터 시작하여 유니 코드 문자 스트림을 로컬 로코딩 된 바이트 스트림으로 변환하는 선호하는 방법은 outputStreamwriter, BufferedWriter 및 PrintWriter 클래스를 사용하는 것입니다.
static Runtime getRuntime()
현재 Java 응용 프로그램과 관련된 런타임 개체를 반환합니다.
void halt (int status)
강제는 현재 실행중인 Java 가상 머신을 종료합니다.
void load (String filename)
지정된 파일 이름을 동적 라이브러리로로드합니다.
void loadlibrary (String libname)
지정된 라이브러리 이름으로 동적 라이브러리를로드합니다.
Long MaxMemory ()
Java Virtual Machine이 사용하려는 최대 메모리 양을 반환합니다.
부울 removeShutdownhook (스레드 후크)
이전에 등록 된 가상 머신을 등록하여 후크를 끄십시오.
void runfinalization ()
최종화를 중단하는 모든 객체의 종료 방법을 실행합니다.
정적 void runfinalizersonexit (부울 값)
쓸모없는. 이 방법 자체는 안전하지 않습니다. 사용중인 객체의 최종 메소드를 호출 할 수있는 반면 다른 스레드는 해당 객체에서 작동하여 잘못된 동작이나 교착 상태를 초래합니다.
긴 총 메모리 ()
Java 가상 머신에서 총 메모리 양을 반환합니다.
void traceinstructions (부울)
명령 추적을 활성화/비활성화합니다.
void tracemethodcalls (boolean on)
방법 통화 추적을 활성화/비활성화합니다.
1.3 프로세스
프로세스를 시작하는 데 사용되는 방법에 관계없이 프로세스 클래스의 인스턴스는 시작 프로세스를 반환하여 프로세스를 제어하고 관련 정보를 얻는 데 사용할 수 있습니다. 프로세스 클래스는 프로세스 입력에서 실행하는 방법, 프로세스 완료를 대기하고 프로세스의 종료 상태를 확인한 후 프로세스를 파괴 (킬)합니다.
void destroy ()
어린이 과정을 죽입니다.
일반적 으로이 방법은 시작된 프로세스를 죽일 수 없으므로 사용하지 않는 것이 좋습니다.
int exitValue ()
아동 프로세스의 출구 가치를 반환합니다.
exitValue () 메소드는 시작 프로세스가 예외로 인해 실행을 완료하거나 종료 한 후에 만 정상 반환 값을 갖습니다. 그렇지 않으면 예외가 발생됩니다.
inputStream geterRorstream ()
아동 프로세스의 오류 스트림을 가져옵니다.
오류 출력이 리디렉션되면 스트림에서 오류 출력을 읽을 수 없습니다.
inputStream getInputStream ()
아동 프로세스의 입력 스트림을 가져옵니다.
프로세스의 표준 출력은이 스트림에서 읽을 수 있습니다.
outputStream getOutputStream ()
아동 프로세스의 출력 스트림을 가져옵니다.
스트림에 작성된 데이터는 프로세스에 대한 표준 입력으로 사용됩니다.
int waitfor ()
프로세스 객체로 표시되는 프로세스가 종료 될 때까지 필요한 경우 현재 스레드가 대기를 대기합니다.
2. 다중 프로세스 프로그래밍 예
일반적으로 Java의 다른 클래스에서 정적 또는 동적 호출에 관계없이 현재 프로세스에서 실행됩니다. 즉, Java Virtual Machine 인스턴스가 하나만 실행됩니다. 때로는 Java 코드를 통해 여러 Java 하위 프로세스를 시작해야합니다. 이 작업을 수행하면 일부 시스템 리소스가 필요하지만 새로 시작된 프로그램은 한 프로세스에서 예외가 발생하면 다른 하위 프로세스에 영향을 미치지 않기 때문에 프로그램이 더 안정적입니다.
Java에서는이 요구 사항을 달성하기 위해 두 가지 방법을 사용할 수 있습니다. 가장 쉬운 방법은 런타임의 EXEC 메소드를 통해 Java ClassName을 실행하는 것입니다. 실행이 성공하면이 메소드는 프로세스 객체를 반환하면 IOException 오류가 발생합니다.下面让我们来看一个简单的例子。
// test1.java 파일 import java.io.*; public class test {public static void main (string [] args) {fileoutputStream fout = 새로운 fileoutputStream ( "c : // test1 .txt"); ; exec ( "Java Test1");Java Test_Exec을 통해 프로그램을 실행 한 후 C 드라이브에 추가 테스트 1.txt 파일이 있음을 알았지 만 출력 정보는 콘솔에 나타나지 않았습니다. 따라서 테스트가 성공적으로 실행되었다고 결론 지을 수 있지만 어떤 이유로 든 테스트의 출력 정보는 Test_Exec의 콘솔에서 출력되지 않습니다. Test_Exec의 아동 프로세스에는 EXEC를 사용하여 생성되기 때문에 이러한 이유는 매우 간단합니다.
아동 프로세스의 출력 정보를 출력하려면 GetInputStream의 프로세스 (아동 프로세스의 출력, 부모 프로세스의 입력)를 통해 아동 프로세스의 출력 스트림을 얻은 다음 아동의 출력 스트림을 전송할 수 있습니다. 부모 프로세스의 콘솔 출력에서 프로세스. 특정 구현 코드는 다음과 같습니다.
// test_exec_out.javaimport java.io = 새로운 BufferedInputStream (p.getInputStream ()); }}
위의 코드에서 볼 수 있듯이 Test_Exec_out.java에서 자식 프로세스의 출력 정보는 행으로 읽은 다음 Test_Exec_out의 각 줄에서 출력이 수행됩니다. 위의 논의는 아동 프로세스의 출력 정보를 얻는 방법입니다. 그런 다음 출력 정보 외에도 입력 정보도 있습니다. 아동 프로세스에는 자체 콘솔이 없으므로 입력 정보는 부모 프로세스에서도 제공해야합니다. GetoutPutStream 프로세스 방법 (즉, 콘솔에서 정보를 입력하지 않고 부모 프로세스에서 아동 프로세스에 대한 입력 정보)을 통해 아동 프로세스에 입력 정보를 제공 할 수 있습니다. 다음 코드를 볼 수 있습니다.
// test2.java 파일 import java.io. "부모 프로세스에 의해 입력 된 정보 :" + br.readline ())}}}}; .getRuntime (); run.exec ( "Java Test2"); flush( ); bw.close(); // The stream must be closed, otherwise information cannot be entered into the child process// System.in.read(); }}
위의 코드에서 Test1은 Test_Exec_in에 의해 전송 된 정보를 가져 와서 출력한다는 것을 알 수 있습니다. bw.flash () 및 bw.close ()를 추가하지 않으면 정보가 아동 프로세스에 도달하지 않으므로 아동 프로세스가 차단 상태로 들어가지만 부모 프로세스가 종료되면 자녀 프로세스도 종료합니다. . 이를 증명하려면 끝에 System.in.read ()를 추가 한 다음 작업 관리자 (Windows 아래)를 통해 Java 프로세스를 볼 수 있으며 Bw.flush () 및 BW를 추가하면 확인할 수 있습니다. .Close (), 하나의 Java 프로세스만이 존재하며, 제거되면 두 개의 Java 프로세스가 존재합니다. 정보가 Test2로 전달되면 정보를 얻은 후 Test2가 종료되기 때문입니다. 다음은 EXEC의 실행이 비동기식이며 실행되는 특정 프로그램이 차단되므로 다음 코드 실행을 중단하지 않을 것이라고 설명해야 할 사항이 있습니다. 따라서 Test2를 실행 한 후에도 다음 코드를 여전히 실행할 수 있습니다.
exec 메소드가 여러 번 다시로드되었습니다. 위에서 사용되는 것은 단지 과부하 일뿐입니다. 또한 exec ( "java.test2")와 같은 명령과 매개 변수를 분리 할 수 있습니다 ( "java", "test2"). Exec는 지정된 환경 변수를 통해 다른 구성으로 Java 가상 머신을 실행할 수 있습니다.
Runtime의 Exec 방법을 사용하여 자식 프로세스를 구축하는 것 외에도 ProcessBuilder를 통해 하위 프로세스를 구축 할 수도 있습니다. ProcessBuilder의 사용은 다음과 같습니다.
// test_exec_out.javaimport java.io. ;………}}
아동 프로세스를 설정할 때 프로세스 빌더는 런타임과 유사합니다. 프로세스를 얻은 후에는 운영이 정확히 동일합니다.
런타임과 마찬가지로 ProcessBuilder는 실행 파일의 환경 정보, 작업 디렉토리 등을 설정할 수도 있습니다. 다음 예는 ProcessBuilder를 사용 하여이 정보를 설정하는 방법을 설명합니다.
ProcessBuilder PB = New ProcessBuilder ( "명령", "Arg2", "Arg2", '' '); // 환경 변수 맵 설정 <문자열, String> Env = pb.environment (); env.put ( "key1", : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : "value1");env.remove("key2");env.put("key2", env .get ( "key1") + "_test"); "../ abcd";