这是默认的实现
SimpleAsyncTaskExecutor
protected void doExecute(Runnable task) { Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task)); thread.start();}
为每个任务创建新线程,在Java中创建线程并不便宜:(参考)
线程对象占用大量内存,在大型应用程序中,分配和取消分配许多线程对象会产生大量内存管理开销。
=>使用此任务执行程序重复执行任务将对应用程序性能产生负面影响(此外,此执行程序默认情况下不限制并发任务的数量)
这就是为什么建议您使用线程池实现的原因,线程创建的开销仍然存在,但是由于线程被重用而不是create-fire-forget而大大减少了。
配置时
ThreadPoolTaskExecutor,应根据您的应用程序负载正确定义两个值得注意的参数:
private int maxPoolSize = Integer.MAX_VALUE
;
这是池中的最大线程数。
private int queueCapacity = Integer.MAX_VALUE;
这是排队的最大任务数。当队列已满时,默认值可能会导致OutOfMemory异常。
使用默认值(
Integer.MAX_VALUE)可能会导致资源不足/服务器崩溃。
您可以通过增加最大池大小的数量来提高吞吐量
setMaxPoolSize(),以减少加载增加时的预热,将核心池大小设置为更高的值
setCorePoolSize()(加载增加时,将初始化两个之间的线程数不相同
maxPoolSize- corePoolSize)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)