OutOfMemoryError после многократного выполнения ThreadPoolExecutor - PullRequest
0 голосов
/ 28 октября 2019

Я использую исполнителя пула потоков, использующего Future и Callable вместо AyscTask, пользуясь возможностью тайм-аута для ожидания ответа, который может занять некоторое время, вызывая мой собственный метод, который работает нормально, называется "isIdOk". Вот как я делаю вызов пула:

public static boolean isOk(final Context context, final String id) {

    boolean result = false;

    final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(1);
    final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, workQueue);
    Future<Boolean> future;

    future = threadPoolExecutor.submit(new Callable<Boolean>() {
        @Override
        public Boolean call() {
            return isIdOk(id);
        }
    });
    try {result = future.get(5000,TimeUnit.MILLISECONDS);}
    catch (ExecutionException e) {
        e.printStackTrace();
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
    catch (TimeoutException e) {
        e.printStackTrace();
    }

    future.cancel(true);
    return result;
}

Я вызываю этот метод ( isOk ) примерно 12 раз в минуту и ​​работает отлично, но через некоторое время метод выдает меня:

java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again

в этой строке:

future = threadPoolExecutor.submit(new Callable<Boolean>() {

Окружение памяти Android Studio " Profiler ", я вижу, что " native Память "и" др."увеличивается при каждом вызове этого метода. Я попытался добавить future.cancel (true) безуспешно. Похоже, что пул остается в памяти, даже если он заканчивается.

Кто-нибудь может мне помочь и объяснить, почему? Заранее спасибо

1 Ответ

2 голосов
/ 28 октября 2019

Вы создаете новый ThreadPoolExecutor каждый раз, когда вызывается isOk, и вы никогда его не выключаете .

Вы когда-либо отправляете только одну работуисполнитель, значит, даже использовать исполнителя, а не просто создать новый поток?

Либо использовать простые потоки, либо повторно использовать исполнителя, поддерживаемого вне метода.

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