ExecutorService - 在方法中创建新实例而不是每个类一个

Jus*_*tas 5 java concurrency multithreading executorservice threadpool

我应该在每个方法调用中创建新的 ExecutorService 还是每个类使用一个?就性能而言,哪个是首选?

public class NotificationService {

    public void sendNotification(User recipient) {

        ExecutorService notificationsPool = Executors.newFixedThreadPool(10);

        // code

        notificationsPool.shutdown();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

public class NotificationService {

    ExecutorService notificationsPool = Executors.newFixedThreadPool(10);

    public void sendNotification(User recipient) {

        // code
    }
}
Run Code Online (Sandbox Code Playgroud)

aha*_*aha 5

在您的第一个代码片段中,它ExecutorService是本地的,即ExecutorService在每个方法调用时创建一个新的,并在方法ExecutorService结束时终止。因此,下次运行该方法时不会重用线程。在第二个代码段中ExecutorService,只要NotificationService实例还活着,就会保留 和它的线程。正如您所看到的,不仅ExecutorService要 GC 的实例更少,而且要创建的线程也更少,并且可以重用它们。作为额外的好处,第二种方法ExecutorService在创建线程后不会产生任何没有预热时间的线程创建。

如果您有多个实例,NotificationService则应声明notificationsPoolstatic,以便在所有实例之间共享池及其线程。

如果需要的线程数量因必须发送的通知数量而异,请使用缓存线程池 ( ExecutorService#newCachedThreadPool()),可能有上限。