服务变量未在另一个线程的方法 运行 中读取
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);
}
}
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);
}
}