java waitfor timeout_processbuilder - 在Java 6中实现`Process.waitFor(long timeout,TimeUnit unit)` - 堆栈内存...

我正在研究一个旧的(Java 6/7)项目,该项目使用ProcessBuilder以与操作系统无关的方式从计算机请求UUID。 我想使用Java 8中的Process.waitFor(long timeout, TimeUnit unit)方法,但是在Java 6中未实现。相反,我可以使用waitFor() ,它阻塞直到完成或出现错误。

我想避免尽可能地将Java版本升级到8,因为这需要进行许多其他更改(例如,从已删除的内部API迁移代码并升级生产Tomcat服务器)。

如何在超时的情况下最好地实现执行过程的代码? 我正在考虑以某种方式实施一个计划,以检查该进程是否仍在运行,并取消/销毁该进程,以及是否已达到超时。

我当前的(Java 8)代码如下所示:

/** USE WMIC on Windows */

private static String getSystemProductUUID() {

String uuid = null;

String line;

List cmd = new ArrayList() {{

add("WMIC.exe"); add("csproduct"); add("get"); add("UUID");

}};

BufferedReader br = null;

Process p = null;

SimpleLogger.debug("Attempting to retrieve Windows System UUID through WMIC ...");

try {

ProcessBuilder pb = new ProcessBuilder().directory(getExecDir());

p = pb.command(cmd).start();

if (!p.waitFor(TIMEOUT, SECONDS)) { // No timeout in Java 6

throw new IOException("Timeout reached while waiting for UUID from WMIC!");

}

br = new BufferedReader(new InputStreamReader(p.getInputStream()));

while ((line = br.readLine()) != null) {

if (null != line) {

line = line.replace("\t", "").replace(" ", "");

if (!line.isEmpty() && !line.equalsIgnoreCase("UUID")) {

uuid = line.replace("-", "");

}

}

}

} catch (IOException | InterruptedException ex) {

uuid = null;

SimpleLogger.error(

"Failed to retrieve machine UUID from WMIC!" + SimpleLogger.getPrependedStackTrace(ex)

);

// ex.printStackTrace(System.err);

} finally {

if (null != br) {

try {

br.close();

} catch (IOException ex) {

SimpleLogger.warn(

"Failed to close buffered reader while retrieving machine UUID!"

);

}

if (null != p) {

p.destroy();

}

}

}

return uuid;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值