Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否应该让一个singleton ThreadPoolTaskExecutor共享不同的服务?_Java_Spring_Threadpool_Threadpoolexecutor - Fatal编程技术网

Java 我是否应该让一个singleton ThreadPoolTaskExecutor共享不同的服务?

Java 我是否应该让一个singleton ThreadPoolTaskExecutor共享不同的服务?,java,spring,threadpool,threadpoolexecutor,Java,Spring,Threadpool,Threadpoolexecutor,根据我的应用程序上下文,我已将ThreadPoolTaskExecutor声明为@Bean,如下所示: @Configuration @ConfigurationProperties(prefix = "application") @EnableCaching public class ApplicationConfig { private static final int POOL_SIZE = 2; @Bean public ThreadPoolTaskExecut

根据我的应用程序上下文,我已将ThreadPoolTaskExecutor声明为@Bean,如下所示:

@Configuration
@ConfigurationProperties(prefix = "application")
@EnableCaching
public class ApplicationConfig {
    private static final int POOL_SIZE = 2;

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setCorePoolSize(POOL_SIZE);

        return pool;
    }
}
我有两个不同的服务需要连接到ThreadPoolTaskExecutor的实例。每个服务都将提交一个Runnable,该Runnable将执行某些特定于服务的工作

例如,以下是两项服务:

@Service
public class TerminatedContractsService {
    @Autowired
    private ThreadPoolTaskExecutor taskExec;

    public void notifyTerminatedContracts(Date d) {
        // do some contract specific work
        taskExec.submit(() -> System.out.println("emailing terminated contracts...")); 
    }
}


@Service
public class SalaryCalculationService {
    @Autowired
    private ThreadPoolTaskExecutor taskExec;

    public void calculateSalary(Date d) {
        // do some salary related work
        taskExec.submit(() -> System.out.println("calculating salaries...")); 
    }
}
共享两个服务的同一ThreadPoolTaskExecutor实例(因为它是单实例)应该是安全的,对吗


您是否预见到这方面的任何问题,以及我是否应该改为原型?

是的,多个服务可以使用同一个执行器。遗嘱执行人所保留的任何状态都不会使其成为一个好主意,将其扔掉并创建一个新的状态

可能有些事情需要注意。如果您向同一执行者提交了持续时间不同的任务,则如果短时间任务排在长时间运行的任务后面,则短时间任务可能会被阻止。您可能希望确保提交给执行者的任务具有类似的持续时间

此外,如果您需要以可预测和可靠的方式执行某些类别的任务,您可能希望为其保留一个专用的执行器。否则,如果这些任务与其他任务共享一个队列,并且存在阻止这些任务完成或使其速度变慢的问题,则您需要可靠执行的任务可能会在它们后面排队

但不,原型范围不应该是必要的