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

Diy*_*kir 2 java multithreading

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

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

@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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

// 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();
}
Run Code Online (Sandbox Code Playgroud)

Alp*_*Alp 5

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

1) 您将重用池中的现有线程,这样会减少开销 2) 更重要的是,如果系统受到攻击并且某些方尝试一次启动无数会话,因为池的大小会导致系统崩溃,那么您的系统将不会陷入困境。被预设。

线程池的使用一点也不复杂。请参阅此处有关线程池的更多信息。还可以查看oracle 文档