线程池 Spring @Value 的池大小不正确 运行

Thread Pool with Spring @Value for Pool size doesnt run properly

我有一个线程池,池大小的输入是使用 spring 中的 @value 传递的,其引用在 .properties 文件中。如下图:

@Value("${project.threadPoolSize}")
private static int threadPoolSize;

private static ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(threadPoolSize);

@PostConstruct
public void MasterProcessService() {
    try {
        LOGGER.debug("Entering processServices in MasterProcessThread ");

当我尝试使用注释值指定线程池大小时,它仅池化 1 个线程并执行睡眠操作,但稍后不会池化其他线程。

当我直接使用线程池大小时:

private static ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(11);

它汇集了所有线程并按照定义执行睡眠和 运行 状态。

谁能帮我在线程池大小中使用@Value而不是直接定义一个数字?

这都是因为 2 个事实:

1 - @Value 不适用于静态字段。如果你想用值填充它 - 不要让它成为静态的。

@Value("${project.threadPoolSize}")
private static int threadPoolSize;

2 - 首先创建静态 threadPool 变量,然后在 threadPoolSize 中填充值(如果它还不是静态的)。

如果您需要通过@Value为某个静态字段设置值,您可以尝试如下操作:

private static ScheduledExecutorService threadPool;

@Value("${project.threadPoolSize}")
public void setThreadPool(Integer poolSize) {
    threadPool = Executors.newScheduledThreadPool(poolSize);
}

值注入将在启动时调用,并将调用 setThreadPool 方法,该方法将使用定义的池大小初始化静态变量。

Spring 不允许将值注入静态变量。请改用 java.lang.Integer