簡體   English   中英

具有(Spring)ThreadPoolTask​​Executor的多線程應用程序

[英]Multi Threaded Application with (Spring) ThreadPoolTaskExecutor

我需要實現多線程后台進程。 我的項目是基於spring的休眠模式,我嘗試了以下代碼,該代碼使用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); } 

    公共無效run(){

      List<User> users = getUserList();; for (User user : users) { try { upgradeUserInBackground(user); } catch (Exception e) { LOGGER.warn("Fail to upgrade user"); } } } 
  1. 是的,它是多線程的,所有提交的任務將同時執行。 Spring還負責解決線程飢餓問題,因此在嘗試一些hack之前,始終會有並行執行。

  2. 是的,可能存在重疊的問題,例如多個線程獲得了同一用戶對象。

  3. 對於您的情況,我建議您使用Spring Batch FMK並對其進行配置/修改,以免在數據庫中不保存任何數據。 使用Tasklet“作用域”,它將為您提供並發性,速度,可靠性和重疊對象的解決方案。

如果在線程中使用同步,則認為這是一個錯誤的設計,請重新考慮您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM