Как отследить статистику выполнения задачи с помощью ExecutorService?

Это работает для меня:

public void ShowToastInIntentService(final String sText) {
    final Context MyContext = this;

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            Toast toast1 = Toast.makeText(MyContext, sText, Toast.LENGTH_LONG);
            toast1.show();
        }
    });
};
9
задан Chris R 28 May 2009 в 20:38
поделиться

3 ответа

ThreadPoolExecutor предоставляет методы beforeExecute и afterExecute , которые вы может переопределить. Вы можете использовать их для записи своей статистики в одну (переменную-член вашего ExecutorService) ConcurrentHashMap с ключом для некоторого уникального идентификатора для ваших задач и хранения типа, времени начала и времени окончания.

Вычислить. статистику из ConcurrentHashMap , когда вы будете готовы их просмотреть.

10
ответ дан 4 December 2019 в 12:20
поделиться

Подкласс исполнитель пула потоков и отслеживание событий выполнения:

Стоит отметить что методы вызываются рабочим потоком, который выполняет задачу, поэтому вам необходимо обеспечить безопасность потоков для кода отслеживания выполнения.

Кроме того, Runnables, которые вы получите, скорее всего, не будут вашими Runnables, а будут заключены в FutureTasks.

4
ответ дан 4 December 2019 в 12:20
поделиться

Я считаю, что два других ответа верны, но, возможно, слишком сложны (хотя мой ответ, хотя и простой, вероятно, не так эффективен, как их.

Почему бы просто не использовать Atomic переменные для отслеживания вашей статистики? Например, количество запущенных задач, общее время выполнения (разделенное на общее количество, вы получите среднее время выполнения). Передайте эти переменные в Runnable для каждой задачи. Если только ваши задачи не слишком кратковременные, я делаю не думайте, что накладные расходы на блокировку атомарной переменной повлияют на вас.

1
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: