Java服务堆空间问题

Java服务堆空间问题,java,multithreading,exception,executorservice,Java,Multithreading,Exception,Executorservice,我有一个Java多媒体阅读问题。我有以下工人阶级: public class ThreadWorker implements Runnable { //some code in here public void run(){ // invokes some recursion method in the ThreadWorker itself, // which will stop eventually { } 要使用线程,我使用的是Exec

我有一个Java多媒体阅读问题。我有以下工人阶级:

public class ThreadWorker implements Runnable {

    //some code in here

    public void run(){
      // invokes some recursion method in the ThreadWorker itself,
      // which will stop eventually
    {
}
要使用线程,我使用的是
ExecutorService

public static int THREAD_NUMBER = 4;
public static ExecutorServide es = Executors.newFixedThreadPool(THREAD_NUMBER);
添加
ThreadWroker
类的实例发生在以下情况:

public void recursiveMethod(Arraylist<Integers> elements, MyClass data){
     if (elements.size() == 0 && data.qualifies()){
         ThreadWorker tw = new ThreadWorker(data);
         es.execute(tw);
         return;
     }



     for (int i=0; i< elements.size(); i++){
          // some code to prevent my problem
          MyClass data1 = new MyClass(data);
          MyClass data2 = new MyClass(data); 
          ArrayList<Integer> newElements = (ArrayList<Integer>)elements.clone();
          data1.update(elements.get(i));
          data2.update(-1 * elements.get(i));
          newElements.remove(i);
          recursiveMethod(newElements, data1);
          recursiveMethod(newElements, data2);     
     {    
}
这是由大量的
threadworker
导致的,因为我要添加到
ExecutorSirvice
来执行,所以内存不足。每个
ThreadWorker
需要大约40 Mb的RAM来满足所有需要

是否有一种方法可以获取有多少线程(实现可运行接口的类的实例)已添加到
ExecutorService
?因此,我可以在上面显示的代码中添加它(在“//一些代码中插入以防止出现问题”),如下所示

因此,我不会使用递归深入或广泛地讨论这些异常抛出情况

诚恳地说,Sergey Aganezov jr.

阻塞队列创建一个备份怎么样

这样,当没有工作线程可用于运行任务时,主线程(正在添加新作业)会运行任务本身,从而防止添加更多作业


在其Javadoc页面上有关于的构造函数选项的更多详细信息。

我认为您的案例非常适合Java JDK的“fork-join”框架。(谷歌搜索该关键词。)

Fork-Join通过尽可能延迟“拆分”来帮助您减少队列中的作业数


不过,您必须将代码重新格式化为这种理念。

Create
TreadPoolExecutor es=new ThreadPoolExecutor(4,4,10000,TimUnit.ms,new ArrayBlockingQueue(10))
然后将rejectedHandler设置为它
es.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunPolicy())。在此之后,如果我理解正确,它将处理我的问题,因为一旦运行线程数达到4,队列线程数达到10,下一个添加的任务将被拒绝,并由主线程执行,停止其中的所有其他活动。
Exception in thread "pool-1-thread-2" java.lang.OutOfMemoryError: Java heap space
while ("number of threads in the ExecutorService" > 10){
    Thread.sleep(10000);
}