Я работаю над многопоточным проектом, в котором мне нужно запускать многозадачные потоки, чтобы измерять конечную производительность моего клиентского кода, поскольку я выполняю тестирование нагрузки и производительности. Так что я создал ниже код, который использует ExecutorService
-ExectuorService vs ThreadPoolExecutor (который использует LinkedBlockingQueue)
Ниже приведен код, который использует ExecutorService
-
public class MultithreadingExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(20);
for (int i = 0; i < 100; i++) {
executor.submit(new NewTask());
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
}
}
class NewTask implements Runnable {
@Override
public void run() {
//Measure the end to end latency of my client code
}
}
Постановка задачи: -
Теперь я читал какую-то статью в интернете. Я узнал, что есть
ThreadPoolExecutor
как хорошо. Поэтому я смутился тем, кого я должен использовать.
Если я заменить выше код from-
ExecutorService executor = Executors.newFixedThreadPool(20);
for (int i = 0; i < 100; i++) {
executor.submit(new NewTask());
}
to-
BlockingQueue<Runnable> threadPool = new LinkedBlockingQueue<Runnable>();
ThreadPoolExecutor tpExecutor = new ThreadPoolExecutor(20, 2000, 0L, TimeUnit.MILLISECONDS, threadPool);
tpExecutor.prestartAllCoreThreads();
for (int i = 0; i < 100; i++) {
tpExecutor.execute(new NewTask());
}
то, что будет делать какие-либо изменения? Я пытаюсь понять, в чем разница между моим исходным кодом, который использует ExecutorService
, и новым кодом, который я вставил, который использует ThreadPoolExectuor
? Некоторые из моих товарищей по команде сказали, что второй (ThreadPoolExecutor) - правильный способ использования?
Может ли кто-нибудь прояснить эту вещь для меня? Спасибо за помощь.
Вы говорили о небольшой пользе? Что это вообще такое? А за сценой исполнители называли ThreadPoolExecutor? Но я считаю, что он использует Unbounded queue, который немного медленный, я думаю? Поправьте меня, если я ошибаюсь. – 2013-04-23 06:01:56
Небольшое преимущество - вы можете играть с аргументами конструктора, но это, как правило, не очень хорошая идея. Вы предоставили ту же неограниченную очередь, поэтому я не вижу вашей точки. Если бы это было медленно, зачем дизайнеры его использовали? –
Существует стоимость использования LinkedBoundedQueue. Это не имеет никакого отношения к тому, что он неограничен, и он очень мал по сравнению с затратами на передачу задач между потоками, которые, как я полагаю, вы не слишком беспокоитесь. –