多线程回调(Callback)编程模式使用

发布时间:2024年01月10日

1、概述

??回调(Callback)是一种常见的编程模式,它允许一个对象在某个事件发生或某个任务完成后,通知另一个对象。在 Java 中,回调通常以接口的形式实现,在某个事件发生时调用接口中定义的方法。
??在异步编程中,回调通常用于处理异步操作的结果。当一个异步操作完成时,可以调用预先注册的回调函数来处理结果或通知完成情况。

2、Callback作用

  • 异步结果处理:在多线程环境下,某些操作可能需要在另一个线程中执行,以避免阻塞主线程。使用回调可以将异步操作的结果返回给主线程进行后续处理。通过异步回调,可以在异步操作完成后立即执行相应的逻辑,而无需等待或主动轮询。
  • 线程间通信:不同线程之间可能需要进行相互通信和数据交换。使用回调可以在多线程环境下实现线程间的数据传递和消息通知。通过注册回调函数,一个线程可以将数据传递给另一个线程,并在合适的时机执行回调函数来处理数据。
  • 事件驱动编程:回调模式常用于事件驱动的编程模型中。当某个事件发生时,注册的回调函数会被自动调用,从而处理相应的事件。通过回调,可以实现对异步事件的监听和响应,增强程序的灵活性和可扩展性。
  • 资源优化:在多线程环境下,使用回调可以避免线程的阻塞或轮询,从而更有效地利用系统资源。当某个线程执行一个耗时的操作时,可以通过回调来通知其他线程在操作完成后进行处理,而不必等待或进行无效的轮询。

3、应用案例

3.1 定义回调接口

public interface MyCallback {
    void onSuccess(String result);
    void onFailure(Exception e);   
}

3.2 实现类

@Component
@Slf4j
public class AsyncTask {

	//线程池对象
    @Resource(name = "taskExecutor")
    private ThreadPoolTaskExecutor taskExecutor;

    public void doTask() {
        taskExecutor.execute(() -> {
            // 模拟耗时操作
            try {
                System.out.println("The task begins");
                // 模拟任务执行
                Thread.sleep(5000);
                // 模拟任务成功完成
                //Integer a = 1 / 0;
                String result = "Task completed successfully.";
                notifyCallback(result, null); // 通知成功回调
            } catch (Exception e) {
                notifyCallback(null, e); // 通知失败回调
                e.printStackTrace();
            }
        });
    }

    // 通知回调方法的示例
    public static void notifyCallback(String result, Exception e) {
        MyCallback callback = new MyCallback() {
            @Override
            public void onSuccess(String result) {
                System.out.println("Task result: " + result);
                // 在这里处理任务成功的逻辑
            }

            @Override
            public void onFailure(Exception e) {
                System.out.println("Task failed with exception: " + e.getMessage());
                // 在这里处理任务失败的逻辑
            }
        };

        if (e != null) {
            callback.onFailure(e);
        } else {
            callback.onSuccess(result);
        }
    }
}

3.3 服务类

@RestController
public class DemoController {
	@Autowired
	public AsyncTask asyncDemo;

	@GetMapping("/async")
	public void getResult() {
		asyncDemo.doTask();
	}
}
文章来源:https://blog.csdn.net/I_Am_Your_God52/article/details/135507214
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。