Servlets java servlet中的多线程

Servlets java servlet中的多线程,servlets,threadpoolexecutor,Servlets,Threadpoolexecutor,在我的应用程序中,用户可以在所有已定义的应用程序上创建数据过滤器,我决定在不同的线程上执行此任务,因为处理所有应用程序可能需要一段时间。我使用的是: private static final executor service executor=Executors.newSingleThreadExecutor() 我的ApplyFilterTask很简单: private static class ApplyFilterTask implements Runnable{ private

在我的应用程序中,用户可以在所有已定义的应用程序上创建数据过滤器,我决定在不同的线程上执行此任务,因为处理所有应用程序可能需要一段时间。我使用的是:

private static final executor service executor=Executors.newSingleThreadExecutor()

我的ApplyFilterTask很简单:

private static class ApplyFilterTask implements Runnable{

    private static ManagerService ms = null;
    int appId;


    public ApplyFilterTask(int appId) {
        this.appId = appId;
    }


    @Override
    public void run() {
        if (ms == null){
            ms = new ManagementService();
            }
        try {
            ms.applyFilters(appId);
        } catch (Exception e) {
            // log the error
        }
}
我希望有以下行为,当用户创建一个新的过滤器时,一个新线程将一个接一个地启动并处理所有应用程序(第二个线程可能需要一段时间),然后我假设终止该线程(以节省资源)

我的问题是:

  • 我不知道把
    executor.shutdown()放在哪里在我的代码中
  • 如果在这个过程中另一个用户创建了一个过滤器,会发生什么?如何让servlet使用相同的线程,或者至少等到第一个线程完成后再创建另一个线程

提前感谢

我不知道规范是否已更改,但您确实不应该在servlet代码中使用线程:

您应该使用容器进行扩展,或者如果需要引入异步处理,则使用进程外工作者和某种消息队列

private static class ApplyFilterTask implements Runnable{

    private static ManagerService ms = null;
    int appId;


    public ApplyFilterTask(int appId) {
        this.appId = appId;
    }


    @Override
    public void run() {
        if (ms == null){
            ms = new ManagementService();
            }
        try {
            ms.applyFilters(appId);
        } catch (Exception e) {
            // log the error
        }
}