gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:17:02 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

JDK7 将解决这个问题并提供新的 API redirectOutput/redirectError 在 ProcessBuilder 中重定向 stdout/stderr。

然而,坏消息是他们忘记提供“Redirect.toNull”,这意味着您将想要执行类似“if(*nix)/dev/null elsif(win)nil”的操作

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

关于java - 从 Java 开始忽略/捕获子进程输出的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com