需要一个Java方法的解决方案,该方法返回一个字符串值,在JVM中只执行n个线程

需要一个Java方法的解决方案,该方法返回一个字符串值,在JVM中只执行n个线程,java,multithreading,executorservice,java.util.concurrent,threadpoolexecutor,Java,Multithreading,Executorservice,Java.util.concurrent,Threadpoolexecutor,返回字符串(文件名)的Java方法在内部为一些无法进一步优化的图像操作消耗内存,比如说,每个方法执行消耗20 MB HeapSpace 此方法作为ProcessingImageData的一部分执行,需要将文件名作为输出返回给RestWebService调用方 而有些n线程是并行处理的,这会产生内存 要逃离OutofMemory HeapSpace,请提供以下建议: 仅设置固定数量的线程以执行此方法 public String deleteImageAndProvideFile(String in

返回字符串(文件名)的Java方法在内部为一些无法进一步优化的图像操作消耗内存,比如说,每个方法执行消耗20 MB HeapSpace

此方法作为ProcessingImageData的一部分执行,需要将文件名作为输出返回给RestWebService调用方

而有些n线程是并行处理的,这会产生内存

要逃离OutofMemory HeapSpace,请提供以下建议: 仅设置固定数量的线程以执行此方法

public String deleteImageAndProvideFile(String inputImage, int deletePageNum){
        // process image
        //find page and delete
        //merge pages to new file
        // return new file Name
}

如果您有许多任务,但希望限制执行这些任务的线程数,请使用带有有界线程池的
ExecutorService

Executors
类有一个用于创建所需内容的助手方法:

  • newFixedThreadPool(int-nothreads)
    ()
根据要使用的内存量调整
nothreads
参数

ExecutionService
文档解释了如何使用API()。您可以提交任务并获取
Future
对象,这些对象可用于等待给定任务完成


在您的用例中,您的一个web请求可能会将任务提交给“全局”执行器服务,然后等待任务完成。或者,您可以设计您的系统,使处理与web请求异步完成;e、 g.在一个请求中提交一个任务,然后发出另一个请求,看看它是否已经完成。

我认为在deleteOmageAndProvideFile中使用私有信号量变量可能会更好,因为它可以防止从多个不同的线程池调用方法。更好的解决方案(针对那个假设的问题!)不将任务提交到多个线程池中。如果您有一个工作线程调用
deleteOmageAndProvideFile
,它会阻塞一个信号量,那么工作线程将无法执行其他操作。因此,您会干扰线程池的其他用途。