使用(Spring)ThreadPoolTask​​Executor的多线程应用程序

时间:2014-06-03 04:28:07

标签: java multithreading spring

我需要实现Multi Threaded后台进程。我的项目是spring,hibernate我试过下面的代码,它使用org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor来执行 以多线程方式进行后台操作。

我需要知道

  1. 如果我使用Spring ThreadPoolTask​​Executor是多线程的吗?
  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");
            }
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 是的,它是多线程的,所有提交的任务都将同时执行。 Spring也负责线程饥饿,所以在你尝试一些黑客攻击之前总会有并行执行。

  2. 是的,可能存在重叠的问题,例如多个线程会获取相同的用户对象。

  3. 对于您的场景,我建议您使用Spring Batch FMK并配置/破解它不保存数据库中的任何数据。它将使用tasklet“scope”为您提供重复对象的并发性,速度,可靠性和解决方案。

  4. 如果你在线程中使用同步,那么它被认为是一个糟糕的设计,重新考虑你的问题。