忽略/捕获子进程输出的最轻的方法是从Java开始

java中的子流程非常昂贵.每个进程通常由NUMBERS个线程支持.

>一个托管进程的线程(通过Linux上的JDK 1.6)
>读取/打印/忽略输入流的线程
>另一个读取/打印/忽略错误流的线程
>一个更多线程来执行超时,并通过您的应用程序监视和终止子进程
>业务逻辑线程,holduntil为子进程返回.

如果您有一个线程focking子进程池来执行任务,则线程数将失控.因此,峰值时可能会有超过两倍的并发线程.

在许多情况下,我们分叉一个进程只是因为没有人能够编写JNI来调用JDK中缺少的本机函数(例如chmod,ln,ls),触发shell脚本等等.

可以保存一些线程,但是应该运行一些线程以防止最坏的情况(输入流上的缓冲区溢出).

如何将Java中创建子流程的开销降至最低?
我在考虑NIO流处理,组合和共享线程,降低后台线程优先级,重用进程.但我不知道他们是否可能.

最佳答案
JDK7将解决此问题并在ProcessBuilder中提供新的API redirectOutput / redirectError以重定向stdout / stderr.

然而坏消息是,他们忘记提供“Redirect.toNull”,这意味着你想要做的事情就像“if(* nix)/ dev / null elsif(win)nil”

令人遗憾的是,NIO / 2 api for Process仍然缺失;但我认为redirectOutput NIO2的AsynchronizeChannel会有所帮助.

转载注明原文:忽略/捕获子进程输出的最轻的方法是从Java开始 - 代码日志