最近在做一项目,其中有一模块需要在页面上配置第三方提供的程序路径,配置完成后系统定时执行(quartz),也可以在页面上手动执行,ajax调用后台方法,执行第三方提供的程序,只要是读取固定格式的文件解析成图片,存到本地目录和数据库中。当要解析的文件很大的时候,就会遇到啤酒爆炸的问题。。。
File file = new File(pro);
if (file.exists()) {
logger.info("seed程序开始执行....");
ProcessBuilder procBuilder = new ProcessBuilder(file.getAbsolutePath());
procBuilder.redirectErrorStream(true); //合并输出子进程的standard和error inputstream
logger.info("合并子进程InputStream{}",procBuilder.redirectErrorStream());
Process process = procBuilder.start();
drainInBackground(process.getInputStream());
int exit = process.waitFor();
logger.info("seed程序退出{}", exit);
josnResult = "exeok";
} else {
logger.info("seed程序未找到....");
josnResult = "notfound";
}
/**
* 启动一个线程,用于排空子进程的输出流,否则子进程会挂起
*/
static void drainInBackground(final InputStream is) {
new Thread(new Runnable() {
public void run() {
try {
while (is.read() >= 0)
;
} catch (IOException e) {
// return on IOException
}
}
}).start();
}
这里的教训是:
为了确保子进程能够结束,你必须排空它的输出流;对于错误流(error stream)也是一样,而且它可能会更麻烦,因为你无法预测进程什么时候会倾
倒(dump)一些输出到这个流中。在 5.0 版本中,加入了一个名为ProcessBuilder 的类用于排空这些流。它的
redirectErrorStream 方法将各个流合并起来,所以你只需要排空这一个流。如果你决定不合并输出流和错误流,你必须并行地
(concurrently)排空它们。试图顺序化地(sequentially)排空它们会导致子进程被挂起。
分享到:
相关推荐
技术总结(自己做项目遇到的问题整理)java 技术总结(自己做项目遇到的问题整理)java
这个是我个人面试的一些总结,希望给大家一些帮助。如果文档有欠缺或者的地方还请大家海涵,自己动手查找资料。(总结的比较粗糙)
Java项目经验汇总(简历项目素材)
这个是实现蜗牛射击敌人的爆炸效果,java ,java,爆炸的代码
特别适合java新手巩固java基础的项目,总共有8个项目的全部代码,都可以直接运行,代码有注释。
Java项目经验汇总(简历项目素材)很完整的文档,值得学习 Java项目经验汇总(简历项目素材)很完整的文档,值得学习 很好很完善的项目描述 很好很完善的项目描述
这里是50个java编写的实战项目,很适合想加强自己能力的人学习的,毕竟学习之后还是靠实践,这个真的很有用的,可以按需所求来寻找合适自己的项目去做。
80个java开发项目经验,适合应届生
java开发工作两年遇到的技术问题以及查找到的解决方案还有一些积累,涉及前端技术,android开发,java后台以及数据库sql优化,session共享,单点登录,kafka入门,websocket,线程安全等。
java项目开发验收交接整套模板,比如测试文档、接口文档、数据库设计、需求规格说明书、用户手册、开发规范。
JAVA框架项目,学习java 的好文档,分享给各位
java版山寨QQ项目 里面有四个压缩包 QQ服务器端.rar QQ客户端.rar 改进QQ客户机服务器视频实现.rar Q第三方库.rar 这个java版山寨QQ项目实现的功能有: 1.实现的java视频聊天; 2.集成了Mina框架; 3.服务器管理...
我相信,在我们做项目的时候,console框中常常出现各种的异常,时间久了,会发现常见的也几个,下面我总结一下常见的异常,供大家参考。 1 java.lang.UnsupportedClassVersionError 从字面上我们可以看出来是...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
Java经典项目集锦
自己收集的一些Java项目实践,总有你需要的资源! 好好学习,天天向上!(*^__^*) ……
java编写的坦克大战小游戏,功能简单,是一个学习java练习的小项目。功能:F2重新开始,敌人死光自动加入,简单的爆炸效果
这个是以前我们公司的项目 。只要布置到服务器,再把数据库导入就可以运行了。 共大家学习
java实现国际化中英文语言切换 java语言切换JSP国际化 java实现国际化中英文语言切换 java语言切换JSP国际化
Java程序设计与项目实践配套光盘