static ExecutorService executor = new ThreadPoolExecutor(10, 20, 20,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100), new ThreadPoolExecutor.AbortPolicy());
private boolean transferTiffByYN(String sourceFile){
log.info("转换开始:"+sourceFile);
Process process = null;
try {
process = Runtime.getRuntime().exec("cmd /c cd /d "+transfer+" & transfer.exe "+sourceFile);
final InputStream br = process.getInputStream();
final InputStream br_error = process.getErrorStream();
Future brFuture = executor.submit(() -> {
consumeInputStream(br);
});
Future errorFuture = executor.submit(() -> {
consumeInputStream(br_error);
});/输入流及时消费防止缓冲区溢出
boolean exitcode = process.waitFor(timeout,TimeUnit.MINUTES);
brFuture.cancel(true);//设置线程为isInterrupted
errorFuture.cancel(true);
process.destroy();
if (exitcode) {
return true;
}
} catch (Throwable e) {
log.error("异常:",e);
}finally {
if (process != null) {
try {
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
} catch (Exception ee) {
}
}
}
log.info("转换失败:"+sourceFile);
return false;
}
private static void consumeInputStream(InputStream stream){
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(stream));
String s ;
StringBuilder sb = new StringBuilder();
while((s=br.readLine())!=null){
if(Thread.currentThread().isInterrupted()){
break;
}
if(s!=null){
// log.info(s);
}
}
} catch (IOException e) {
log.error("异常", e);
}finally {
if(br!=null){
try {
br.close();
} catch (IOException e) {
// log.error("异常", e);
}
}
}
}
java调用本地进程及线程池处理输入流
最新推荐文章于 2022-11-06 12:24:22 发布