如何在Java线程结束时将其杀死?

2nbm6dog  于 2022-11-20  发布在  Java
关注(0)|答案(3)|浏览(148)

我第一次在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调试显示线程名称增加)

blmhpbnm

blmhpbnm1#

在线程启动并且run()方法返回之后,Thread将终止并最终被垃圾收集。您会看到ID号递增,因为您为每个这样的操作启动了新线程。因此不需要显式终止。

fhg3lkii

fhg3lkii2#

使用@Async

在Web应用程序中,手动创建线程并不是正确的方法。这个过程是恒定的,最好维护一个线程池。
由于您使用的是Sping Boot ,您所需要的一切都是用@EnableAsync注解配置类,ThreadPoolTaskExecutor将在后台为您配置。您可以通过application.properties对其进行自定义(例如,指定所需的最小/最大池大小)。
为了告诉我们某个方法应该在不同的线程中执行,您需要在它上面放置注解@Async(* 注意,这个方法应该驻留在Spring管理的类中,也就是说,使用构造型注解之一进行注解 * @Component@Controller,等等)。

@Async
public Advert saveAdvert(Advert advert) {
    Advert advertToSave = advertRepository.save(advert);

    try {
        populateAdvertSearch(advertToSave);
    } catch (ParseException e) {
        e.printStackTrace();
    } catch (OfficeNotFoundException e) {
        e.printStackTrace();
    } catch (OfficePropertyNotFoundException e) {
        e.printStackTrace();
    }
    
    return advertToSave;
}
ybzsozfc

ybzsozfc3#

当然,从外部终止正在运行的线程并不是一个好主意,但如果您愿意,可以使用ExecutorService
假设您希望在5秒后终止特定线程;

if (executor.awaitTermination(5, TimeUnit.SECONDS)) {
  // continue
} else {
  // force shutdown
  executor.shutdownNow();
}

相关问题