Я наблюдаю такое поведение, когда у меня есть собственная реализация интерфейса Runnable, а значение глобальной переменной остается поточно-ориентированным в нескольких моих тестах.
public class MyRunnable implements Runnable {
private String taskName;
private int executeCount = new Random().nextInt(10);
public MyRunnable(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
System.out.println(this.taskName + " in Thread ID: " + Thread.currentThread().getId() + ". execute count: " + ++executeCount);
}
}
Я запускаю 10 потоков и выполняю свой код одновременно. Каким-то образом значение executeCount
остается безопасным, и я вижу ожидаемое значение.
Это сообщение? Каждый раз, когда я запускаю тест, и получается, что он печатает правильные значения, но на самом деле это небезопасно? Или поведение ожидается?
Это мой начальный этап:
@SpringBootApplication
@EnableScheduling
public class DynamicSchedularApplication implements ApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(DynamicSchedularApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
ThreadPoolTaskScheduler ts = threadPoolTaskScheduler();
for (int i = 0; i < 10; i++) {
ts.scheduleAtFixedRate(new MyRunnable("Task"+i),
Duration.ofMillis(3000));
}
}
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler ts = new ThreadPoolTaskScheduler();
ts.setPoolSize(10);
return ts;
}
}