注:lambda表达式请看另外一篇文章(lambda表达式使用)
一,使用线程池
1.写线程池配置类;@Configuration
注解用于告诉 Spring 容器,被该注解标注的类是一个配置类,类似于传统的 XML 配置文件。Spring 会对这个类进行特殊处理,将其内部使用 @Bean
注解定义的方法所返回的对象注册为 Spring 容器中的 Bean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
public class ThreadPoolConfig {
@Bean(name = "smsExecutor")
public Executor smsExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("SmsThread-");
executor.initialize();
return executor;
}
}
2.写短信发送工具类,sendSmsAsync方法使用线程池( Lambda 表达式)异步发送短信,
public class SmsUtils {
public static void sendSmsAsync(final User user, ThreadPoolTaskExecutor executor) {
executor.execute(() -> {
try {
// 模拟发送短信的耗时操作,此处写发送短信的业务代码
Thread.sleep(2000);
System.out.println("已向用户 " + user.getName() + " (手机号:" + user.getPhoneNumber() + ")发送欢迎短信。");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("发送短信时发生中断异常: " + e.getMessage());
} catch (Exception e) {
System.err.println("发送短信时发生错误: " + e.getMessage());
}
});
//关闭线程池
executor.shutdown();
}
}
3.service实现类,在此类中主线程添加用户,异步线程(使用线程池)发送短息消息给用户并记录发送结果,告诉用户注册成功
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
//ThreadPoolConfig配置类中 @Bean
注解定义的方法所返回的对象注册为 Spring 容器中的 Bean
//此处使用依赖注入的方式使用
@Autowired
private ThreadPoolTaskExecutor smsExecutor;
@Override
public User addUser(User user) {
User savedUser = userRepository.save(user);
SmsUtils.sendSmsAsync(savedUser, smsExecutor);
return savedUser;
}
}
二。使用普通多线程
1.写短信发送普通工具类
public class SmsUtils {
public static void sendSms(User user) {
try {
// 模拟发送短信的耗时操作,此处写发送短信的业务代码
Thread.sleep(2000);
System.out.println("已向用户 " + user.getName() + " (手机号:" + user.getPhoneNumber() + ")发送欢迎短信。");
} catch (Exception e) {
System.err.println("发送短信时发生错误: " + e.getMessage());
}
}
}
2.service实现类,在此类中主线程添加用户,异步线程(使用普通多线程(lambda表达式))发送短息消息给用户并记录发送结果,告诉用户注册成功
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
//ThreadPoolConfig配置类中 @Bean
注解定义的方法所返回的对象注册为 Spring 容器中的 Bean
//此处使用依赖注入的方式使用
@Autowired
private ThreadPoolTaskExecutor smsExecutor;
@Override
public User addUser(User user) {
User savedUser = userRepository.save(user);
//lambda表达式可以直接调用工具类;也可以直接使用外部变量(因为在 Lambda 表达式使用该变量时,实际上使用的是变量的一个副本,而非变量本身。)
new Thread(() -> {
SmsUtils.sendSms(user);
}).start();
return savedUser;
}
}