Java JDK 1.5 Example、外部プロセス実行のタイムアウト
JDK 1.5 Processクラスにはタイムアウト付きwaitForがない
1.8以降はタイムアウト付きwaitForがある。
Javadoc Process waitFor()タイムアウト付き
Example Code
package ExampleRunShell;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
public class Main {
package ExampleRunShell;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
StringBuffer output = new StringBuffer();
class TimeOutTimerTask extends TimerTask {
private Process process;
public boolean isTimeout = false;
public TimeOutTimerTask(Process process) {
this.process = process;
}
@Override
public void run() {
System.out.println("Timeout!!");
isTimeout = true;
process.destroy();
}
}
Process process;
try {
process = Runtime.getRuntime().exec("ping");
TimeOutTimerTask timeOutTimerTask = new TimeOutTimerTask(process);
Timer timer = new Timer("Shell Exec Timeout Timer");
timer.schedule(timeOutTimerTask, TimeUnit.SECONDS.toMillis(60));
// timer.schedule(timeOutTimerTask, 1);
int result = process.waitFor();
System.err.println(result);
timer.cancel();
if(timeOutTimerTask.isTimeout == false) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while((line = bufferedReader.readLine()) != null) {
output.append(line + "\n");
}
System.out.println(output.toString());
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}

