线程池 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
。
我有一个线程池,池大小的输入是使用 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
。