[英]Multi Threaded Application with (Spring) ThreadPoolTaskExecutor
我需要實現多線程后台進程。 我的項目是基於spring的休眠模式,我嘗試了以下代碼,該代碼使用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); }
公共無效run(){
List<User> users = getUserList();; for (User user : users) { try { upgradeUserInBackground(user); } catch (Exception e) { LOGGER.warn("Fail to upgrade user"); } } }
是的,它是多線程的,所有提交的任務將同時執行。 Spring還負責解決線程飢餓問題,因此在嘗試一些hack之前,始終會有並行執行。
是的,可能存在重疊的問題,例如多個線程獲得了同一用戶對象。
對於您的情況,我建議您使用Spring Batch FMK並對其進行配置/修改,以免在數據庫中不保存任何數據。 使用Tasklet“作用域”,它將為您提供並發性,速度,可靠性和重疊對象的解決方案。
如果在線程中使用同步,則認為這是一個錯誤的設計,請重新考慮您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.