服务变量未在另一个线程的方法 运行 中读取

The service variable is not read in a method running in another thread

Spring应用在服务中自旋无限循环

@Service
public class MyService {
    public boolean isStart = false;

    @Async("threadPoolTaskExecutor")
    public void sending() {        
        while (isStartService) {
        ...
        }     
    }
}

@Service
public class OneService {
  @Autowired  
  private final MyService myService;
  
  public void start(boolean isStautus) {
    myService.isStart = true;
    myService.sending();
 }
}

在另一个服务中,我设置变量的值为Start Service = true。虽然此方法上没有 Async 注释,但一切正常。但是一旦它被添加,并且它开始在一个单独的线程中 运行,这个方法中的 isStartService 变量现在总是 = false。循环永远不会执行。如何在此流中正确传递此变量的值。 IE。起初它应该是 true,一段时间后它的值被传递为 false,因此该方法停止工作。

我试图将 isStart 变量设置为可变的。没用

问题是 @Async 触发了 proxy 的创建,因此当您直接改变变量时,代理不会拦截该调用。

isStart 属性 创建一个 setter,它将起作用。

此应用程序与 setter 一起按预期工作。您应该使该字段 volatile 以便它始终获取该字段的更新值。

@SpringBootApplication
@EnableAsync
public class SO72313483 {

    public static void main(String[] args) {
        SpringApplication.run(SO72313483.class, args);
    }

    private final static Logger logger = LoggerFactory.getLogger(SO72313483.class);

    @Service
    public static class MyService {
        private volatile boolean isStartService = false;

        @Async("taskExecutor")
        public void sending() throws Exception {
            while (isStartService) {
                logger.info("Here");
                Thread.sleep(5000);
            }
        }

        public void setStartService(boolean startService) {
            isStartService = startService;
        }
    }

    @Service
    public static class OneService {

        @Autowired
        private MyService myService;

        public void start(boolean isStatus) throws Exception{
            myService.setStartService(true);
            myService.sending();
        }
    }

    @Autowired
    OneService oneService;

    @Bean
    ApplicationRunner runnerSO72313483() {
        return args -> oneService.start(true);
    }

}