본문 바로가기
Back-end/JAVA & Spring

[Java] Process, ProcessBuilder 자바에서 프로세스 다루기

by 꼬바리 2021. 5. 11.

1. 자바에서의 Process

 

Runtime 클래스는 자바 런타임 환경을 캡슐화 한다.

 

Runtime 클래스는 new 할 수 없지만 Runtime.getRuntime ()이라는 static 메소드를 이용하여 현재 실행중인 프로그램의 Runtime클래스에 대한 참조를 얻을 수 있다.

 

Runtime의 exec() 메소드를 통해 프로그램을 실행 시키고 Process에 대한 참조를 얻는다.

 

ProcessBuilder.start() 메서드를 통해 Process에 대한 참조를 얻을 수도 있다.

 

Process 클래스는 프로세스에서 입력, 출력을 수행( getInputStream, getOutputStream, getErrorStream ), 프로세스가 완료 될 때까지 대기( waitFor ), 프로세스의 종료 상태를 확인( exitValue ), 프로세스를 종료( destroy ), 프로세스가 살아 있는지( isAlive )를 확인하는 메서드를 제공한다.

 

 

2. 자바에서의 ProcessBuiler

 

Process 클래스의 보조 클래스로 start 메서드를 호출하면서ProcessBuilder 클래스의 인스턴스에 정의 된 속성으로 새 프로세스를 만들 수 있다. 

 

ProcessBuilder는 동기화 된 클래스가 아니며, 명시적으로 동기화되지 않으면 멀티 스레드로부터 안전하지 않습니다. 

 

Java 1.5부터 ProcessBuilder.start()를 이용하여 프로세스를 만드는 것을 선호한다.

 

매개변수를 전달하는 방법에 따라 아래 2개의 생성자중 하나가 실행된다.

 

ProcessBuilder(List<String> command)

ProcessBuilder(String... command)

 

3. Runtime클래스 실습1

package javatest;

 

public class PrtocessTest1 {

	String[] s = {"Hello", "Oraclejavacommunity"};  

	public static void main(String[] args) {

		Runtime r = Runtime.getRuntime();

 

		// JVM에서 이용가능한 코어 개수를 리턴

		System.out.println("No of CPU Core : " + r.availableProcessors());

		

		System.out.println("Total memory: " + r.totalMemory());

		System.out.println("Free memory: " + r.freeMemory());		

 

		for (int i = 0; i <= 100000; i++) {

			new PrtocessTest1();

		}

		System.out.println("객체생성 이후 ..............");

		System.out.println("Total memory: " + r.totalMemory());

		System.out.println("Free memory: " + r.freeMemory());	

 

		r.gc();

		System.out.println("GC 이후 ..............");

		System.out.println("Total memory: " + r.totalMemory());

		System.out.println("Free memory: " + r.freeMemory());

	}

 

}

 

No of CPU Core : 4
Total memory: 155189248
Free memory: 153553432
객체생성 이후 ..............
Total memory: 155189248
Free memory: 149463864
GC 이후 ..............
Total memory: 155189248
Free memory: 153824112

4. Process, ProcessBuilder 실습

 

package javatest;

 

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.concurrent.TimeUnit;

 

public class ProcessTest2 {

	public static void main(String[] args) throws Exception {

		Runtime r = Runtime.getRuntime();

		Process p1 = r.exec("notepad");

		p1.waitFor(3, TimeUnit.SECONDS);

		p1.destroy();

 

		ProcessBuilder pb1 = new ProcessBuilder("notepad", "a,txt");

		Process p2 = pb1.start();

		p2.waitFor(3, TimeUnit.SECONDS);

		p2.destroy();

 

		Process p3 = r.exec("ping 127.0.0.1");

		InputStream is1 = p3.getInputStream();

		BufferedReader br = new BufferedReader(new InputStreamReader(is1));

		for (String str; (str = br.readLine()) != null;) {

			System.out.println(str);

		}

		System.out.println("Process ended...(종료코드) ::: " + p3.exitValue());

		

		Thread.sleep(3000);

		

		ProcessBuilder pb2 = new ProcessBuilder("ping", "127.0.0.1");

		Process p4 = pb2.start();

		InputStream is2 = p4.getInputStream();

		BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));

		for (String str; (str = br2.readLine()) != null;) {

			System.out.println(str);

		}

		System.out.println("Process ended...(종료코드) ::: " + p4.exitValue());

	}

}

 

 

Ping 127.0.0.1 32바이트 데이터 사용:
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128

127.0.0.1에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 0ms, 평균 = 0ms
Process ended...(종료코드) ::: 0

Ping 127.0.0.1 32바이트 데이터 사용:
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128

127.0.0.1에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 0ms, 평균 = 0ms
Process ended...(종료코드) ::: 0

 

 

 

출처 : ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=762

728x90
반응형

댓글