Мне нужно реализовать многопоточный фоновый процесс. Мой проект - это весна, спящий режим, на котором я пытался использовать код ниже, который использует org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor для выполнения нижеописанной операции в многопоточном режиме.
мне нужно знать
Если "ДА" Должен ли я использовать синхронизацию метода upgradeUserInBackground(), чтобы избежать таких ситуаций? Альтернативное решение?
public class UserUpdateProcessor implements InitializingBean {
private ThreadPoolTaskExecutor executor;
public void afterPropertiesSet() throws Exception {
executor.execute(new UserBackgorundRunner ());
}
}
private class UserBackgorundRunner extends Thread {
public UserBackgorundRunner() {
this.setDaemon(true);
this.setPriority(MIN_PRIORITY);
}
public void run() {
List<User> users = getUserList();;
for (User user : users) {
try {
upgradeUserInBackground(user);
} catch (Exception e) {
LOGGER.warn("Fail to upgrade user");
}
}
}
Да, это многопоточность, все поставленные задачи будут выполнены одновременно. Весна также заботится о голодном потоке, поэтому будет выполняться параллельное выполнение, пока вы не попробуете некоторые хаки.
Да, могут быть перекрывающиеся проблемы, такие как несколько потоков, которые определяют один и тот же объект пользователя.
Для вашего сценария я бы посоветовал вам использовать Spring Batch FMK и настроить/взломать его, чтобы не сохранять данные в базе данных. Это даст вам параллелизм, скорость, надежность и решение перекрывающихся объектов с помощью "прицела" прицела.
Если вы используете синхронизацию в потоках, это считается плохим дизайном, переосмыслите вашу проблему.