我需要实现Multi Threaded后台进程。我的项目是spring,hibernate我试过下面的代码,它使用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");
}
}
}
答案 0 :(得分:0)
是的,它是多线程的,所有提交的任务都将同时执行。 Spring也负责线程饥饿,所以在你尝试一些黑客攻击之前总会有并行执行。
是的,可能存在重叠的问题,例如多个线程会获取相同的用户对象。
对于您的场景,我建议您使用Spring Batch FMK并配置/破解它不保存数据库中的任何数据。它将使用tasklet“scope”为您提供重复对象的并发性,速度,可靠性和解决方案。
如果你在线程中使用同步,那么它被认为是一个糟糕的设计,重新考虑你的问题。