【发布时间】:2011-07-07 07:12:13
【问题描述】:
Java 中的子进程非常昂贵。每个进程通常由 NUMBERS 个线程支持。
- 一个线程来承载进程(通过 JDK 1.6 on linux)
- 读取/打印/忽略输入流的线程
- 另一个线程读取/打印/忽略错误流
- 更多线程来执行超时以及监视和终止您的应用程序的子进程
- 业务逻辑线程,holduntil为子流程返回。
如果你有一个线程池子进程来执行任务,线程的数量就会失控。因此,在峰值时可能会有超过两倍的并发线程。
在很多情况下,我们 fork 一个进程只是因为没有人能够编写 JNI 来调用 JDK 中缺少的本机函数(例如 chmod、ln、ls)、触发 shell 脚本等。
可以保存一些线程,但应该运行一些线程以防止最坏的情况(输入流上的缓冲区溢出)。
如何将在 Java 中创建子进程的开销降到最低? 我正在考虑 NIO 流处理、组合和共享线程、降低后台线程优先级、重用进程。但我不知道它们是否可能。
【问题讨论】:
-
为什么这(大量线程)是个问题?这些线程中的大多数都会“等待”某些东西,例如等待子进程写入的东西。所以这些线程不应该消耗任何 CPU。
-
高线程数是有效的。在内存方面 - 每个线程分配它自己的堆栈。在 CPU 方面 - 上下文切换会降低您的 CPU 能力。而且每个线程都带有锁,这是程序员必须关心的对象。
标签: java multithreading subprocess