用spring boot制作线程概念

时间:2017-09-14 09:25:19

标签: java spring multithreading spring-boot java-threads

我有一个cronjob,

users
id      company_id 
1       1
2       1
...
10000   1 

cron_events

id event_name       company_id
1  birthday_party   1

所以我需要向公司1的所有用户发送电子邮件,

我知道怎么做一个,

但我想通过多线程概念来做到这一点,我是线程概念的新手,任何人都可以指导我这个,

这是我现有的代码,

这是我的Controller类

@Scheduled(fixedDelay = 15000)
public void sendNotificationToUser() {
    Future<Boolean> sendNotificationToUser = cronService.sendNotificationToUser();
    if (sendNotificationToUser.isDone()) {
        logger.info(
                "-->Notification [Sent] to Patient ");
    }
}

这是我的实现类

@Async
@Transactional
public Future<Boolean> sendNotificationToUser() {
logger.info("-->in the function of sendNotificationToUser Function");

List<User> users = cronReferralRepository.findByCompanyIdAndActive(1L, true);

for (User user : users) {

Future<Boolean> futureCampaignCreated = processUser(user);
}

return new AsyncResult<Boolean>(true);
}

@Async
private Future<Boolean> processUser(User user) {

    System.out.println("Thread Name --> " +  Thread.currentThread().getName());

    Long userId = user.getId();

    String patientFirstName = null;
    String patientLastName = null;

    if (user != null) {
        patientFirstName = user.getFirstName();
        patientLastName = user.getLastName();
    }
    String patientFullName = patientFirstName + " " + patientLastName;

    //send mail code
...
}

仍然我的线程打印相同的线程名称,它是如何可能的,但我期待一个不同的线程名称,

1 个答案:

答案 0 :(得分:0)

多线程本质上意味着在并行线程上运行代码。 不是执行顺序代码,而是将此执行分成多个分支。

Main thread Main thread | | | | | |__ __ __ | send mail M1 | | | | | send mail M2 --> | M1 | M3 | send mail M2 * M2 | send mail M3 | | *

默认情况下,您的代码使用单个线程,但是当调用@Asynch方法时,将在新线程中处理此方法的执行。

我认为您想要实现的是以并行线程发送邮件,每个用户一个。 但是,在您的代码中,为了利用多个线程,您必须在调用@asynch方法之前移动for循环,以便每次调用此方法都将创建一个新线程。

@Asynch创建的每个线程都被&#34;销毁&#34;只要@asynch方法完成。

现在主线程可以等待所有被调用的@asynch的结束,或者不是根据您的要求。 您是否需要等待所有邮件都被发送? 或者您是否想在调用@Asynch方法后立即执行主线程执行?

案例1 等待发送所有邮件。

Main thread | | |__ __ __ ° | | | ° M1 | M3 | M2 | | | *

案例2 处理执行而不等待线程结果。

Main thread | | |__ __ __ | | | | | M1 | M3 | M2 | *

在你回答完这些问题之后,请进一步阅读有关未来和 线程连接。

请记住,使用spring boot,您可以轻松配置并行线程数,队列大小和其他有用设置。