我第一次在Sping Boot Web应用程序中使用线程时,当我进行调试时,我看到每个调用方法的线程名称都在增加,如Thread-1、Thread-2......,所以我认为程序不是在杀死线程,而是在为每个调用创建新线程。
下面是我的代码:
public Advert saveAdvert(Advert advert) {
Advert advertToSave = advertRepository.save(advert);
new Thread(() -> {
try {
populateAdvertSearch(advertToSave);
} catch (ParseException e) {
e.printStackTrace();
} catch (OfficeNotFoundException e) {
e.printStackTrace();
} catch (OfficePropertyNotFoundException e) {
e.printStackTrace();
}
}).start();
return advertToSave;
}
这里的populateAdvertSearch()
是一个void方法。我只想独立于主线程来执行这个任务,因为它很长,我不想让客户端等待整个方法,所以另一个独立的线程将执行这个void方法。但是正如我所说的,我认为程序不会杀死线程。我如何杀死线程或我应该显式杀死吗(我不确定,也许它在执行完成后已经被杀死,但为什么Intellij IDEA调试显示线程名称增加)
3条答案
按热度按时间blmhpbnm1#
在线程启动并且
run()
方法返回之后,Thread
将终止并最终被垃圾收集。您会看到ID号递增,因为您为每个这样的操作启动了新线程。因此不需要显式终止。fhg3lkii2#
使用
@Async
在Web应用程序中,手动创建线程并不是正确的方法。这个过程是恒定的,最好维护一个线程池。
由于您使用的是Sping Boot ,您所需要的一切都是用
@EnableAsync
注解配置类,ThreadPoolTaskExecutor
将在后台为您配置。您可以通过application.properties
对其进行自定义(例如,指定所需的最小/最大池大小)。为了告诉我们某个方法应该在不同的线程中执行,您需要在它上面放置注解
@Async
(* 注意,这个方法应该驻留在Spring管理的类中,也就是说,使用构造型注解之一进行注解 *@Component
,@Controller
,等等)。ybzsozfc3#
当然,从外部终止正在运行的线程并不是一个好主意,但如果您愿意,可以使用
ExecutorService
。假设您希望在5秒后终止特定线程;