У меня есть приложение (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 потоков?
Нет нужды в создании большого числа потоков для вашей задачи. Используйте асинхронный подход на пуле с ограниченным числом потоков. Т.е. всякий раз, когда нужно отправить HTTP запрос и получить на него ответ, отправляйте задачу на отпраку запроса в пул и регистрируйте коллбык/фьючер/промиз, которые будет вызваны/закомпличены при получении ответа или при ошибке. Таким образом вам не потребуется большого количества потоков.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Делаю приложение - мозайка из полигонов
Камрады, приветствуюОсваиваю java core
Хочу создать игру для Android что-то типа Крокодила или Шляпы, где будут генерироваться словаПодскажите, как можно организовать хранение этих...
Есть две связанные таблицы, Runner и Registration