ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Java异步回调的实现

2026/8/24 21:10:47 拓冰建站 浏览量
Java异步回调的实现

在Java中,异步回调是一种常见的编程模式,用于处理异步操作和事件驱动的场景。异步回调通常用于处理耗时的任务,以避免阻塞主线程,提高应用程序的性能和响应性。大白话来讲就是方法A调用方法B的一种实现过程,其中方法B是非常耗时的,异步回调机制就是让方法A调用方法B但不阻塞当前线程,且方法B执行完后会自动调用方法A的一个指定的方法(往往在这里就是将结果传回来处理)。

定义服务类(方法B)


public class ServiceDemo {/*** doService 是一个耗时的操作,如果num大于100则返回false,否则返回true* @param num* @return* @throws InterruptedException*/public Boolean doService(int num) throws InterruptedException {Thread.sleep(5000);if(num>100){return false;}return true;}/*** doService2 和 doService 的区别是,doService2 会在执行完毕后调用回调函数* @param num* @param callBackDemo* @return* @throws InterruptedException*/public Boolean doService2(int num,CallBackDemo callBackDemo) throws InterruptedException {Thread.sleep(5000);if(num>100){callBackDemo.fail("num大于100");return false;}callBackDemo.success("num小于100");return true;}
}

定义调用类(方法A)

public class CallBackDemo {public void success(String msg){// 回调函数,接受执行结果msgSystem.out.println(msg);}public void fail(String msg){// 回调函数,接受执行结果msgSystem.out.println(msg);}@Testpublic void test1() throws InterruptedException {// 1. 阻塞式调用ServiceDemo serviceDemo = new ServiceDemo();Boolean state = serviceDemo.doService(1000);System.out.println(state);// 主线程会阻塞System.out.println("主线程会阻塞");Thread.sleep(10000);}@Testpublic void test2() throws InterruptedException{// 2. 异步调用ServiceDemo serviceDemo = new ServiceDemo();Runnable runnable = ()-> {try {Boolean state = serviceDemo.doService(1000);System.out.println(state);} catch (InterruptedException e) {e.printStackTrace();}};Thread thread = new Thread(runnable);thread.start();// 主线程不会阻塞System.out.println("主线程不会阻塞");Thread.sleep(10000);}@Testpublic void test3() throws InterruptedException{// 3. 异步回调函数ServiceDemo serviceDemo = new ServiceDemo();Runnable runnable = ()-> {try {Boolean state = serviceDemo.doService2(1000,this);System.out.println(state);} catch (InterruptedException e) {e.printStackTrace();}};Thread thread = new Thread(runnable);thread.start();// 主线程不会阻塞System.out.println("主线程不会阻塞");Thread.sleep(10000);}
}

以上仅仅是对这个回调机制进行简单演示,具体应该使用接口来多态等优化实现!