Да, ExecutorService
является идеальным выбором для этой задачи:
ExecutorService exec = Executors.newFixedThreadPool(50);
Запустите измерение времени и просто отправьте ему задания по 10 КБ:
for(int i = 0; i < 10000; ++i) {
exec(new SubmitToUrlTask());
}
Рассмотрите возможность использования того же экземпляраof (без сохранения состояния или поточно-ориентированного) SubmitToUrlTask
вместо создания нового в каждой итерации.
В конце вы должны дождаться окончания выполнения исполнителя:
exec.shutdown();
if(!exec.awaitTermination(1, TimeUnit.MINUTE)) {
throw new IllegalStateException("Waiting for too long, captain!");
}
Прекратить измерениевремя сейчас.awaitTermination()
блоков до всех задач завершено, но не дольше указанного времени (в примере 1 минута).
Как только поток закончен, я думаю, этонемедленно запустит другую задачу?
Да, ExecutorService
- это группа потоков и очередь задач.Если поток не имеет ничего общего, он берет первую задачу из очереди.
Мне нужен поток для возврата, так как я должен отслеживать успехи / неудачи, где это должно храниться (он должен быть потокобезопасным).
Вы можете использовать Callable<Boolean>
и Future<Boolean>
для отслеживания результатов.Также, если вы используете только один экземпляр SubmitToUrlTask
, он может иметь две переменные типа AtomicInteger
, отслеживающие как успехи, так и неудачи.Это намного проще, если вам не нужно отслеживать отдельные результаты.
При этом вы уже рассматривали возможность использования JMeter , который обладает всеми этими функциями + гораздо больше из коробки?Также имеется консольная утилита ab
.