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)
在您的第一个代码片段中,它ExecutorService是本地的,即ExecutorService在每个方法调用时创建一个新的,并在方法ExecutorService结束时终止。因此,下次运行该方法时不会重用线程。在第二个代码段中ExecutorService,只要NotificationService实例还活着,就会保留 和它的线程。正如您所看到的,不仅ExecutorService要 GC 的实例更少,而且要创建的线程也更少,并且可以重用它们。作为额外的好处,第二种方法ExecutorService在创建线程后不会产生任何没有预热时间的线程创建。
如果您有多个实例,NotificationService则应声明notificationsPool为static,以便在所有实例之间共享池及其线程。
如果需要的线程数量因必须发送的通知数量而异,请使用缓存线程池 ( ExecutorService#newCachedThreadPool()),可能有上限。
| 归档时间: |
|
| 查看次数: |
2048 次 |
| 最近记录: |