Многопоточное приложение с (Spring) ThreadPoolTaskExecutor

1

Мне нужно реализовать многопоточный фоновый процесс. Мой проект - это весна, спящий режим, на котором я пытался использовать код ниже, который использует org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor для выполнения нижеописанной операции в многопоточном режиме.

мне нужно знать

  1. Если я использую Spring ThreadPoolTaskExecutor, это многопоточность?
  2. Будут ли совпадающие проблемы, такие как несколько потоков, обретают один и тот же объект пользователя?
  3. Если "ДА" Должен ли я использовать синхронизацию метода 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");
            }
        }
    
    }
    
Теги:
multithreading
spring

1 ответ

0
Лучший ответ
  1. Да, это многопоточность, все поставленные задачи будут выполнены одновременно. Весна также заботится о голодном потоке, поэтому будет выполняться параллельное выполнение, пока вы не попробуете некоторые хаки.

  2. Да, могут быть перекрывающиеся проблемы, такие как несколько потоков, которые определяют один и тот же объект пользователя.

  3. Для вашего сценария я бы посоветовал вам использовать Spring Batch FMK и настроить/взломать его, чтобы не сохранять данные в базе данных. Это даст вам параллелизм, скорость, надежность и решение перекрывающихся объектов с помощью "прицела" прицела.

Если вы используете синхронизацию в потоках, это считается плохим дизайном, переосмыслите вашу проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню