Почему мой код создает много потоков (java.lang.OutOfMemoryError: невозможно создать новый собственный поток) - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь проверить, находится ли элемент в строке, просматривая список параллельно, разбивая его:

`открытый класс ParallelSearchComment extends RecursiveTask { приватный статический финал long serialVersionUID = 1L;

int lo; 
int hi; 
String com;
String query;
int T;

ParallelSearchComment(String c, int l, int h, String q, int Treshold){
    com=c;
    lo=l;
    hi=h;
    query=q;
    T=Treshold;
}

private int findMiddle(String text){ // Only split at whitespace chars (or some words would be missed) 

    int middle = lo + ((hi - lo)/2);
    int i= middle;                                                            
    for (i = middle; i != hi && com.charAt(middle) != ' ' && i-middle <= query.length()+1; i++){

    }  
    middle = i;
    return middle;
}

@Override
protected Boolean compute() {
    int middle = findMiddle(com);
    if (hi - lo < T || hi-middle <= query.length()) {//hi-middle <= query.length()
        return com.substring(lo, hi).contains(query);
    } else {

        ParallelSearchComment left = new ParallelSearchComment(com, lo, middle, query, T);
        ParallelSearchComment right = new ParallelSearchComment(com, middle, hi, query, T);

        left.fork();
        boolean resRight = right.compute();
        boolean resLeft = left.join();

        return resRight || resLeft;
    }

}

static boolean ParallelSearchComment(String c, String query, int T,int p) {
    final ForkJoinPool fjPool = new ForkJoinPool(p);
    ParallelSearchComment t = new ParallelSearchComment(c, 0, c.length(), query, T);
    return fjPool.invoke(t);
}

`

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Поскольку ваш фрагмент не показывает, как вызывается static boolean ParallelSearchComment, я предполагаю, что он используется для инициализации вашего поиска. Кроме того, я предполагаю, что вы запустили поиск только один раз с вашего main.

При этом вполне вероятно, что значение параллелизма, или p, которое вы передаете, выше, чем ваша текущая куча JVM. Посмотрите, что произойдет, когда вы уменьшите его до 5 или 10.

0 голосов
/ 06 мая 2018

Проблема в том, что вы создаете новый экземпляр ForkJoinPool каждый раз, когда вызываете ParallelSearchComment. Вместо этого вы должны создать один ForkJoinPool и использовать его во всем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...