线程池异步回调方式

线程池异步回调方式

​ 当请求进入Controller层中的时候,我们要经历一系列的CRUD的操作才能返回信息,往往其中部分的CRUD并不是需要及时完成的,可以在返回信息后完成。也就是说需要异步去操作,那在JAVA中如何去实现呢?

首先这种异步去执行肯定是存在时间差的,也就是一个请求是分时间段去处理的。这里就需要一个根据时间去执行的线程池,封装各种不同的任务丢入线程池中,完成之后再回调方法通知你完成,可以在回调方法中去做相关处理完成的逻辑。下面展示一个简单的Demo例子代码。

代码展示

首先需要封装一个Task类

  1. 该Task类继承自Runnable接口,需要自定义实现run方法。
  2. Java 8中出现的新接口Consumer,是实现任务执行完成后回调的关键。
  3. 任务的构造方法中可以根据业务加入更多的参数来判断,这里简单的加了两个参数来判断
import java.util.function.Consumer;

public class Runtask implements Runnable {
    private String consumer;
    private Consumer<Runtask> finishCallback;
    private boolean isSuccess;

    public boolean isSuccess() {
        return isSuccess;
    }

    public Runtask(String consumer, Consumer<Runtask> finishCallback) {
        this.consumer = consumer;
        this.finishCallback = finishCallback;
        this.isSuccess = true;
    }

    @Override
    public void run() {
        System.out.println("开始执行run方法");
        System.out.println("开始执行回调方法");
        finishCallback.accept(this);
    }
}

创建一个业务层去调用这个任务并且放入线程池中

import org.springframework.stereotype.Service;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

@Service
public class TaskService {

    public void createTask() {
        String consumer = "111";
        System.out.println("创建任务");
        //新建任务并传入参数
        Runtask task = new Runtask(consumer, finishCallback());
        long delay = 10;
        System.out.println("任务放入线程池中");
        ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2);
        //放入线程池中延时执行
        scheduled.schedule(task, delay, TimeUnit.SECONDS);
        System.out.println("任务放入完毕");
    }

    private Consumer<Runtask> finishCallback() {
        return (Runtask task) -> {
            if (task.isSuccess()) {
                System.out.println("任务执行成功后执行的操作");
            }
            System.out.println("这里也可以做一些成功后的操作");
        };
    }
}

控制层去调用

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class TestController {
    @Resource
    private TaskService taskService;

    @GetMapping("testRuntask")
    public void testRuntask() {
        System.out.println("开启运行");
        taskService.createTask();
    }
}

调用截图

在这里插入图片描述

总结

  1. 可以封装不同的任务去实现不同的业务
  2. 提供了一种异步回调的方式
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Boost.Asio 提供了一些工具来处理异步操作,但是它并没有提供现成的线程池来处理异步回调或者请求。但是,你可以使用 Boost.Asio 的 `io_service` 类来实现一个简单的线程池。 具体来说,你可以创建一个 `io_service` 对象,并将其用于管理异步操作。然后,你可以创建一个线程池,并将每个线程关联到 `io_service` 对象上。当你需要执行一个异步操作时,你可以将其提交到 `io_service` 对象中,并让线程池中的某个线程处理该操作。 以下是一个简单的例子: ```cpp #include <boost/asio.hpp> #include <thread> #include <vector> int main() { boost::asio::io_service io_service; boost::asio::io_service::work work(io_service); // Create a thread pool with 4 threads std::vector<std::thread> threads; for (int i = 0; i < 4; ++i) { threads.emplace_back([&io_service]() { io_service.run(); }); } // Submit some work to the io_service io_service.post([]() { // Do some async work }); // Wait for all threads to finish for (auto& thread : threads) { thread.join(); } return 0; } ``` 在这个例子中,我们创建了一个 `io_service` 对象和一个 `io_service::work` 对象,以保证 `io_service` 不会在没有任务的情况下退出。然后,我们创建了一个包含 4 个线程的线程池,并将每个线程与 `io_service` 对象关联。最后,我们将一些工作提交到 `io_service` 对象中,并等待所有线程完成工作。 需要注意的是,这只是一个简单的例子,实际的线程池需要考虑更多的细节,比如如何管理任务队列、如何保证线程安全等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值