java - 平衡 Java J2EE 服务器上 CPU/内存资源的线程使用

标签 java multithreading jboss jakarta-ee cpu-usage

我正在开发一个在 JBoss 上运行的文档协作网站/在线服务。在具有 2.5Ghz cpu 和 2GB RAM 的 Linux 机器上进行测试时,页面响应非常快,我们正在考虑使用这台机器启动。

问题出现在文档处理过程中。用户上传文档后,将启动一个新线程,其中包括转换文档、从文档中提取文本和图像并通过 https 将文档上传到另一台服务器上。一个用户可以一次上传很多文档,处理它们的线程是并发工作的。在此处理完成之前,网站几乎没有响应。

关于如何以某种方式在处理文档的线程上分配一定百分比的 CPU/内存(例如最大 40%),您能给我一些建议吗?如果这不可能,请告诉我一种方法/模式,它将以某种方式在响应页面请求的 JBoss 和处理文档的线程之间分担机器上的负载。

问候

最佳答案

实际上并没有办法为给定线程分配一定百分比的 CPU/内存时间。您可以降低线程优先级,这样它就不会使所有资源饱和:

int oldPriority = Thread.currentThread().getPriority();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// process your documents here
Thread.currentThread().setPriority(oldPriority);

可能会让您更接近指定百分比的更好方法是使用具有固定线程数的 ExecutorService 并通过它运行所有文档处理。如果你给它一半的服务器处理器数量,那么它会有效地将文档处理限制在服务器 CPU 时间的 50%。您需要一个像这样设置线程池的单例服务:

int threads = Runtime.getRuntime().availableProcessors() / 2;
ExecutorService service = Executors.newFixedThreadPool(threads);

然后在您的 Web 请求中,您可以将实现文档处理的 Callable 传递给服务,并阻塞直到它完成:

Callable<Result> callable = new DocumentProcessorCallable<Object>(doc);
Result result = service.submit(callable).get();

或者您可能不希望通过提供传递给 service.execute(runnable)Runnable 实现来立即返回。参见 ExecutorService获取更多示例和文档。

关于java - 平衡 Java J2EE 服务器上 CPU/内存资源的线程使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358583/

相关文章:

tomcat - 如何使用 Narayana JTA 5.0.3.Final 为在 Tomcat 中运行的 Web 应用程序提供 XA 事务支持?

java - 从同一包中的另一个类访问 JDBC 方法

java - JButton Action 监听器不起作用

Fest 的 Java Swing UI 测试驱动程序替换

java - 从不同线程检查时,ConcurrentLinkedQueue 大小返回零

c# - 防止代码定时部分的上下文切换(或测量然后减去实际未在线程中花费的时间)

java - EJB-QL 3 中的 MEMBER OF 不起作用

java - 如何配置 Drools 与 JBOSS 一起运行?

java - 具有执行器框架的多个任务

iphone - 来自 ios webview 的 Cookie