首页 > 其他分享 >关于异步多线程

关于异步多线程

时间:2023-07-28 11:45:22浏览次数:36  
标签:异步 处理 springframework CompletableFuture 关于 org import 多线程

方法一:利用线程池或@Async注解

使用@Async注解,可以实现多个方法并行执行,然后将它们的返回结果进行处理。@Async注解会使被标注的方法在调用时,将任务提交给一个线程池中的线程去执行,不会阻塞主线程。

下面是一个简单的示例,演示如何使用@Async注解来处理多个方法的返回结果:

  1. 创建一个异步服务类,用于处理多个方法并行执行:

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {

@Async
public CompletableFuture<String> method1() {
// 模拟耗时操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture("Result from method1");
}

@Async
public CompletableFuture<String> method2() {
// 模拟耗时操作
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture("Result from method2");
}

@Async
public CompletableFuture<String> method3() {
// 模拟耗时操作
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture("Result from method3");
}
}

  1. 在另一个类中调用这些异步方法并处理返回结果:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

@Component
public class AsyncMethodCaller {

@Autowired
private AsyncService asyncService;

public void callAsyncMethods() throws ExecutionException, InterruptedException {
// 并行调用三个异步方法
CompletableFuture<String> future1 = asyncService.method1();
CompletableFuture<String> future2 = asyncService.method2();
CompletableFuture<String> future3 = asyncService.method3();

// 等待所有异步方法执行完毕
CompletableFuture.allOf(future1, future2, future3).join();

// 获取异步方法的返回结果
String result1 = future1.get();
String result2 = future2.get();
String result3 = future3.get();

// 处理返回结果
System.out.println("Result from method1: " + result1);
System.out.println("Result from method2: " + result2);
System.out.println("Result from method3: " + result3);
}
}

在上面的示例中,AsyncService类中的三个方法都添加了@Async注解,使它们能够并行执行。然后在AsyncMethodCaller类中,调用这些异步方法并等待它们的执行结果,最后处理返回结果。

需要注意的是,@Async注解需要和@EnableAsync注解一起使用,以开启Spring的异步支持。在Spring Boot应用中,只需要在配置类上添加@EnableAsync注解即可。另外,异步方法的返回值类型可以使用CompletableFuture来包装异步结果,以便更方便地处理返回结果

方法二:使用消息中间件RabbitMQ

使用消息中间件可以实现异步处理多个方法并处理它们的返回结果。消息中间件可以将任务发布到消息队列中,然后多个消费者(处理器)可以并行地从队列中取出任务进行处理。处理完成后,可以将处理结果发送到另一个队列,或者使用其他方式进行处理。

下面是一个简单的示例,演示如何使用消息中间件实现异步处理多个方法并处理返回结果。这里以RabbitMQ作为消息中间件为例:

  1. 定义消息生产者,用于将任务发布到RabbitMQ的消息队列中:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MessageProducer {

@Autowired
private RabbitTemplate rabbitTemplate;

public void sendMessage(String message) {
rabbitTemplate.convertAndSend("my_queue", message);
}
}

  1. 定义消息消费者,用于从RabbitMQ的消息队列中接收任务并处理:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class MessageConsumer {

@RabbitListener(queues = "my_queue")
public String handleMessage(String message) {
// 在这里处理任务,可以调用相应的异步方法并获取返回结果
// 模拟耗时操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result from handleMessage: " + message;
}
}

  1. 在另一个类中调用消息生产者发送任务,并处理消息消费者返回的结果:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessageProcessing {

    @Autowired
    private MessageProducer messageProducer;

    public void processMessages() {
        // 发送任务到消息队列
        messageProducer.sendMessage("Task 1");
        messageProducer.sendMessage("Task 2");
        messageProducer.sendMessage("Task 3");

        // 在这里处理消息消费者返回的结果,可以使用回调函数或异步方式处理
        // 等待一段时间,以便消息消费者处理完任务并返回结果
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 处理消息消费者返回的结果
        // 这里假设消息消费者的返回结果已经存储在某个地方,例如数据库中
        String result1 = "Result from handleMessage: Task 1";
        String result2 = "Result from handleMessage: Task 2";
        String result3 = "Result from handleMessage: Task 3";

        // 处理返回结果
        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
    }
}

 

在上面的示例中,MessageProducer类用于将任务发送到RabbitMQ的消息队列中,MessageConsumer类作为消息消费者,从队列中接收任务并处理,并返回处理结果。在MessageProcessing类中,调用消息生产者发送任务,并等待一段时间,以便消息消费者处理完任务并返回结果。然后处理消息消费者返回的结果。

通过消息中间件实现异步处理可以更好地解耦任务的生产和消费,提高系统的可扩展性和灵活性。同时,消息中间件还可以实现任务的持久化,确保任务不会丢失,以及实现任务的重试机制,增加系统的健壮性。

标签:异步,处理,springframework,CompletableFuture,关于,org,import,多线程
From: https://www.cnblogs.com/origin-zy/p/17587184.html

相关文章

  • 关于python中对np.array数据进行元素操作的讨论(形参与实参)
    最近发现了python中,如果将np.array(ndarray)类型的数据作为实参,传递给形参时,实参和形参会同时改变。例如下面的代码:importnumpyasnpnum=np.array([[1,2],[3,4]])deftest(a):a[0,1]=9print(a)test(num)print(num)输出结果:[[19][34]][[19][34]]会发......
  • 关于SkeyeVSS平台用户管理功能的场景分析
    关于SkeyeVSS平台用户管理功能的场景分析SkeyeVSS视频融合云平台是视开科技开发的一款基于端-边-云一体化架构的视频融合+AI智能分析网关平台,SkeyeVSS平台支持视频汇聚、融合管理,能兼容多类型设备、多协议接入,可提供的视频功能包括:视频监控、无插件直播录像、云存储、检索回放、智......
  • 关于Feign客户端
    对Feign客户端配置还有其他的吗  ChatGPT 是的,对Feign客户端的配置还有一些其他的内容。Feign是一个声明式的Web服务客户端,它简化了在Spring应用程序中调用HTTPAPI的过程。除了在FeignConfig类中配置ObjectMapper之外,还可以在Feign客户端中进行其他......
  • 高效文件传输:小文件采用零拷贝、大文件采用异步io+直接io
    一般会如何实现文件传输?服务器提供文件传输功能,需要将磁盘上的文件读取出来,通过网络协议发送到客户端。如果需要你自己编码实现这个文件传输功能,你会怎么实现呢?通常,你会选择最直接的方法:从网络请求中找出文件在磁盘中的路径后,如果这个文件比较大,假设有320MB,可以在内存中分配32KB......
  • 关于Jquery jqGrid的使用
    [color=red][b]官方文档[/b][/color]:[url]http://www.trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs[/url]jqGrid使用总结[url][/url]jqGrid的属性列表:[url]http://www.helloweba.com/view-blog-162.html[/url]jqgrid的一些操作动态增加列用......
  • 同步电路与异步电路
    同步电路与异步电路同步电路电路中所有触发器均连接同一个时钟脉冲源,触发器的状态变化均与时钟脉冲信号同步;电路中所有时钟同源同相;同相位时钟:始终频率不同,但是时钟边沿对齐;同源时钟:由同一个时钟源(PLL模拟锁相环、DLL数字锁相环)产生,不要求时钟信号相位相同;同时钟域......
  • 关于异步请求的两个案例
    下载百度图片:importasyncioimportjsonimportrandomimportreimporthttpximportrequestsimporttimefromurllibimportparseimportosfromloguruimportloggerlogger.add("children.log",rotation="23:59",encoding="utf-8")......
  • 关于HCIE-Datacom Part-1的一点想法
    目录关于提升速度理解是第一位的顺序与结构通过Vim提速附件部分草图关于提升速度理解是第一位的之所以把理解放在第一位,是因为对知识点理解的越深刻,就会越有自信,心态说就会越平和,从而产生一种掌控感,这种掌控感在考试的过程当中至关重要,据我所知,有相当一部分同学是因为考试时过......
  • BOSHIDA DC电源模块关于转换率的问题
    BOSHIDADC电源模块关于转换率的问题DC电源模块是现代电子设备中必不可少的模块之一,其作用是将交流电转换成为直流电,为电子设备提供稳定、可靠的电源。在进行DC电源模块选型时,一个重要的指标是其转换率,也被称作效率。本文将对DC电源模块的转换率进行详细解析。一、转换率的定义......
  • web | 在node中使用axios进行同步和异步请求
    web|在node中使用axios进行同步和异步请求最近在看怎么用nodejs整爬虫,摸索一下axios的使用。constaxios=require('axios');//异步写法axios("https://mz1.top") .then(res=>{ console.log("https://mz1.top"); console.log(res.headers); }) .catch(err=>......