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

2023-12-25

java中的子进程非常昂贵。每个进程通常由多个线程支持。

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

如果你有一个线程池子进程来执行任务,线程的数量就会失控。因此,峰值时可能有超过两倍的并发线程。

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

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

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


JDK7将解决这个问题并提供新的API重定向输出 http://download.java.net/jdk7/docs/api/java/lang/ProcessBuilder.html#redirectOutput%28java.lang.ProcessBuilder.Redirect%29ProcessBuilder 中的 /redirectError 重定向 stdout/stderr。

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

令人难以置信的是,Process 的 NIO/2 api 仍然缺失;但我认为redirectOutput+NIO2的AsynchronizeChannel会有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从Java开始忽略/捕获子进程输出的最简单方法 的相关文章

随机推荐