Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring boot应用程序中从同一类启动新线程_Java_Spring_Spring Boot_Asynchronous_Concurrency - Fatal编程技术网

Java 如何在spring boot应用程序中从同一类启动新线程

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

各位。我的spring boot应用程序中有一个服务类。我应该调用一个sync和一个async方法

@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参数;
//一些代码
返回参数;
}
}
但这不是异步工作

问题:

  • 如何替换线程(…).start()以异步启动方法。或
  • 我怎样才能使第二个例子起作用

  • 为什么不使用
    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?如果没有,这至少可以帮助您异步运行该方法。