Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,235
#1

работа с тяжелыми задачами - Android

07.07.2015, 14:12. Просмотров 822. Ответов 5
Метки нет (Все метки)

Я пишу приложение для Android-смартфонов. У меня есть "тяжёлая" задача, которую можно разделить на несколько потоков (например, от 2 до 1024). Как, на Ваш взгляд, определить оптимальное количество потоков, в которых нужно выполнять задачу? Как это конкретно сделать в Android-приложении?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
07.07.2015, 14:17     работа с тяжелыми задачами #2
Количество потоков, насколько я понимаю (могу и ошибаться) никак не виляет на производительность, если они запущены на одном и том же ядре процессора. Соответственно для подобных задач нужно создать по потоку на ядро. Но опять же повторюсь могу ошибаться, сам серьезно в это не вникал.
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
07.07.2015, 16:35     работа с тяжелыми задачами #3
если заглянуть в исходники AsyncTask то в самом начале мы увидим
Java
1
2
3
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
надо расшифровывать?

дальше можно увидеть
Java
1
2
 private static final BlockingQueue<Runnable> sPoolWorkQueue =
            new LinkedBlockingQueue<Runnable>(128);
и потом
Java
1
2
3
4
5
6
/**
     * An {@link Executor} that can be used to execute tasks in parallel.
     */
    public static final Executor THREAD_POOL_EXECUTOR
            = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
Другими словами в пул асинктаска можно напихать 128 задач. Следующая, по-идее, кинет исключение.
То есть это не одновременно работающие задачи, а очередь длиной 128.

Лично я ориентировался на эти данные если бы надо было запускать много-много задач. Запускал бы их по 128 штук пачками и ждал пока все не вернут результат. Ну или по 64 штуки в очереди. А AsyncTask сам разберется сколько потоков стартовать на устройстве одновременно.
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,235
07.07.2015, 19:16  [ТС]     работа с тяжелыми задачами #4
Runtime.getRuntime().availableProcessors(); что делает этот код можете пояснить??
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
07.07.2015, 19:35     работа с тяжелыми задачами #5
Цитата Сообщение от yura91 Посмотреть сообщение
Runtime.getRuntime().availableProcessors(); что делает этот код можете пояснить??
название переменной CPU_COUNT ни о чем не говорит вообще?
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,235
08.07.2015, 15:03  [ТС]     работа с тяжелыми задачами #6
CPU_COUNT CPU это что то связано с процессором COUNT счетчик то есть количество доступных ядер процессора я так понимаю верно ?? Поправьте если заблуждаюсь??
Yandex
Объявления
08.07.2015, 15:03     работа с тяжелыми задачами
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru