ExecutorService vs ThreadPoolExecutor using LinkedBlockingQueue

我正在处理一个多线程项目,其中我需要生成多个线程来测量客户端代码的端到端性能,因为我正在做负载和性能测试。因此,我创建了下面的代码,该代码使用.ExecutorService

以下是代码: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

如果我从以下位置替换我的上述代码:

ExecutorService executor = Executors.newFixedThreadPool(20);
    for (int i = 0; i < 100; i++) {
        executor.submit(new NewTask());
    }

自:

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());
    }

这会有什么不同吗?我试图了解我使用的原始代码和使用粘贴的新代码之间的区别是什么。我的一些队友说第二个(ThreadPoolExecutor)是正确的使用方式。ExecutorServiceThreadPoolExecutor

任何人都可以为我澄清这一点吗?


答案 1

以下是以下来源:Executors.newFixedThreadPool

 public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

它在内部使用具有默认配置的类,如上所示。现在有些情况下,默认配置不合适,比如需要使用优先级队列等。在这种情况下,调用方可以通过实例化底层并向其传递所需的配置来直接处理底层。ThreadPoolExecutorLinkedBlockingQueueThreadPoolExecutor


答案 2

那会有什么不同吗?

这将使您的代码更加复杂,但收效甚微。

我试图理解我使用ExperatorService的原始代码和我粘贴的使用ThreadPoolExectuor的新代码之间的区别是什么?

几乎没有。 创建一个 ThreadPoolExecutor 来完成实际工作。Executors

我的一些队友说第二个(ThreadPoolExecutor)是正确的使用方式?

仅仅因为它更复杂并不意味着它是正确的做法。设计人员提供了 Executors.newXxxx 方法,使您的生活更简单,因为他们希望您使用这些方法。我建议你也使用它们。