Java 如何在spring boot应用程序中从同一类启动新线程
各位。我的spring boot应用程序中有一个服务类。我应该调用一个sync和一个async方法Java 如何在spring boot应用程序中从同一类启动新线程,java,spring,spring-boot,asynchronous,concurrency,Java,Spring,Spring Boot,Asynchronous,Concurrency,各位。我的spring boot应用程序中有一个服务类。我应该调用一个sync和一个async方法 @Service public class CreationRequestServiceImpl implements CreationRequestService { @Autowired private MessageSender messageSender; @Override public void sendMessage() { se
@Service
public class CreationRequestServiceImpl implements CreationRequestService {
@Autowired
private MessageSender messageSender;
@Override
public void sendMessage() {
sendMessageToManager(createParamMap(/*some param*/));
//send message to customr async
new Thread(
() -> sendMessageToCustomer(createParamMap(/*some param*/))
).start();
}
private void sendMessageToManager(Map<String, String> param) {
MessageTemplate messageTemplate;
//some code
messageSender.send(messageTemplate)
}
private void sendMessageToCustomer(Map<String, String> param) {
MessageTemplate messageTemplate;
//some code
messageSender.send(messageTemplate)
}
private Map<String, String> createParamMap(/*some param*/) {
Map<String, String> param;
//some code
return param;
}
}
为异步调用创建新服务
@Service
public class AsyncMessageSenderImpl implements AsyncMessageSender {
@Async("taskExecutor")
@Override
public void run(Runnable runnable) {
runnable.run();
}
}
重构我的CreationRequestServiceImpl类
@Service
public class CreationRequestServiceImpl implements CreationRequestService {
@Autowired
private MessageSender messageSender;
@Autowired
private AsyncMessageSender asyncMessageSender;
@Override
public void sendMessage() {
sendMessageToManager(createParamMap(/*some param*/));
//send message to customr async
asyncMessageSender.run(
() -> sendMessageToCustomer(createParamMap(/*some param*/))
);
}
private void sendMessageToManager(Map<String, String> param) {
MessageTemplate messageTemplate;
//some code
messageSender.send(messageTemplate)
}
private void sendMessageToCustomer(Map<String, String> param) {
MessageTemplate messageTemplate;
//some code
messageSender.send(messageTemplate)
}
private Map<String, String> createParamMap(/*some param*/) {
Map<String, String> param;
//some code
return param;
}
}
@服务
公共类CreationRequestServiceImpl实现CreationRequestService{
@自动连线
私人消息发送者;
@自动连线
私有异步消息发送方异步消息发送方;
@凌驾
公共无效发送消息(){
sendMessageToManager(createParamMap(/*某些参数*/);
//向customr异步发送消息
asyncMessageSender.run(
()->sendMessageToCustomer(createParamMap(/*某些参数*/))
);
}
私有void sendMessageToManager(映射参数){
消息模板消息模板;
//一些代码
messageSender.send(messageTemplate)
}
私有void sendMessageToCustomer(映射参数){
消息模板消息模板;
//一些代码
messageSender.send(messageTemplate)
}
私有映射createParamMap(/*某些参数*/){
Map参数;
//一些代码
返回参数;
}
}
但这不是异步工作
问题:
为什么不使用
CompletableFuture
,它更加优雅,在异常处理和编写代码的功能方式方面为您提供了许多强大的选项。
我会这样做-
@Override
public void sendMessage() {
sendMessageToManager(createParamMap(/*some param*/ ));
CompletableFuture.runAsync(() -> sendMessageToCustomer(createParamMap(/*some param*/ )));
}
为什么不使用
CompletableFuture
,它更加优雅,在异常处理和编写代码的功能方式方面为您提供了许多强大的选项。
我会这样做-
@Override
public void sendMessage() {
sendMessageToManager(createParamMap(/*some param*/ ));
CompletableFuture.runAsync(() -> sendMessageToCustomer(createParamMap(/*some param*/ )));
}
当需要从异步任务返回结果时,使用CompletableFuture。然而,我认为他的任务正在返回void,因此,他只需要向他的TaskExecutor添加一个任务,这真的很有意义。比你强!当需要从异步任务返回结果时,使用CompletableFuture。然而,我认为他的任务正在返回void,因此,他只需要向他的TaskExecutor添加一个任务,这真的很有意义。比你强!是否已使用@enablesync注释启用异步?如果没有,这至少可以帮助您运行async方法。您是否使用@enablesync注释启用了async?如果没有,这至少可以帮助您异步运行该方法。