gpt4 book ai didi

java - 何时使用线程池而不是调用新线程

转载 作者:行者123 更新时间:2023-12-02 12:00:51 25 4
gpt4 key购买 nike

我有一个 JAX-RS/Jersey Rest API,它获取请求并需要在单独的线程中执行额外的工作,但我不确定是否建议使用线程池。我预计会有很多对该 API 的请求(每天几千个),但我在后台只有一个额外的作业。

每次都像这样创建一个新线程会不会很糟糕?任何意见,将不胜感激。我以前没有使用过线程池。

@Get
@Path("/myAPI")
public Response myCall() {
// call load in the background
load();
...
// do main job here
mainJob();
...
}

private void load() {
new Thread(new Runnable() {
@Override
public void run() {
doSomethingInTheBackground();
}
}).start();
}

编辑:只是为了澄清。我只需要一个额外的作业在后台运行。该作业将调用另一个 API 来记录一些信息,仅此而已。但它必须对每个请求执行此操作,并且我不需要等待响应。这就是为什么我想在新的后台线程中执行此操作。

编辑2:这就是我现在想出的办法。谁能告诉我这是否可行(它在本地工作)以及我是否需要关闭执行程序(请参阅我在代码中的评论)?

// Configuration class
@Bean (name = "executorService")
public ExecutorService executorService() {
return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
}

// Some other class
@Qualifier("executorService")
@Autowired
private ExecutorService executorService;
....
private void load() {
executorService.submit(new Runnable() {
@Override
public void run() {
doSomethingInTheBackground();
}
});

// If I enable this I will get a RejectedExecutionException
// for a next request.
// executorService.shutdown();
}

最佳答案

线程池是处理这个问题的好方法,原因有两个:

1) 您将重用池中的现有线程,从而减少开销2) 更重要的是,如果系统受到攻击并且某些方尝试立即启动无数个 session ,因为池的大小是预设的,您的系统不会陷入困境。

线程池的使用一点也不复杂。请参阅here有关线程池的更多信息。另请查看 oracle documentation

关于java - 何时使用线程池而不是调用新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31699532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com