Оптимизация многопоточности

213
01 января 2020, 03:50

У меня есть приложение (java, android), которое запускает N фоновых потоков Число потоков задаётся пользователем. Запуск потоков происходит в цикле for:

 for (int i = 0; i < count; i++) {
            final int u = i;
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    int num = u;
                    Log.i("Инфoрмaция: ", "Пoтoк " + Integer.toString(num + 1) + " нaчaл рaбoту.");
....
            Log.i("Инфoрмaция: ", "Пoтoк " + Integer.toString(num + 1) + " зaкoнчил рaбoту.");
                }
            });
            thread.start();
        }

В потоках происходит обращение несколько HTTP запросов и получение ответов. Когда потоков ~50 приложение работает хорошо, но когда потоков >100 приложение в определённый момент зависает(при этом фоновые процессы работают), а после и вовсе вылетает. В логах ничего нет, либо я не успеваю увидеть из-за постоянных информационных сообщений от GС Единственное, что успел увидеть:

A/OpenGLRenderer: Failed to set damage region on surface 0x7bed8b7c80, error=EGL_BAD_ACCESS

И

java.lang.NullPointerException: Null reference used for synchronization (monitor-enter) at com.android.org.conscrypt.ConscryptFileDescriptorSocket.finalize

Как можно оптимизировать приложение и сделать возможным нормальную работу с >100 потоков?

Answer 1

Нет нужды в создании большого числа потоков для вашей задачи. Используйте асинхронный подход на пуле с ограниченным числом потоков. Т.е. всякий раз, когда нужно отправить HTTP запрос и получить на него ответ, отправляйте задачу на отпраку запроса в пул и регистрируйте коллбык/фьючер/промиз, которые будет вызваны/закомпличены при получении ответа или при ошибке. Таким образом вам не потребуется большого количества потоков.

READ ALSO
Как создать генерацию слов в приложении под Android?

Как создать генерацию слов в приложении под Android?

Хочу создать игру для Android что-то типа Крокодила или Шляпы, где будут генерироваться словаПодскажите, как можно организовать хранение этих...

157
Получения сущности по вторичному ключу. Hibernate

Получения сущности по вторичному ключу. Hibernate

Есть две связанные таблицы, Runner и Registration

120