Java回调测试

mac2024-07-14  51

package test.liuwei; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author liuwei * @date 2019-10-31 16:39 * @desc 回调测试类 * 类A调用类B的方法b,类B在执行调用的某个节点反过来调用类A的方法a,即所谓回调 * A在调用b时根据需要可以同步也可以异步,分别称为同步调用和异步调用 * B在回调a时根据需要可以同步也可以异步,分别称为同步回调和异步回调 */ @Slf4j public class CallBackTest { public static void main(String[] args) { MainClass mainClass = new MainClass(); mainClass.doSometing("同步回调测试",true); log.info("\n======-=-=-=-分隔符-=-=-=-======\n"); mainClass.doSometing("异步回调测试",false); } } /** * 主类 * 业务逻辑主类,在其中调用任务计算类的某个方法实现指定的计算任务 * 任务计算类对象可以是主类的全局变量,也可以是局部变量 */ class MainClass{ private final static Logger log = LoggerFactory.getLogger(MainClass.class); //任务计算类对象 private TaskClass taskClass = new TaskClass(); //主任务 public void doSometing(String taskName,boolean isSynCallBack){ log.info("---->主类doSometing开始"); log.info("---->主类调用任务类"); //同步调用任务计算类 taskClass.runATask(this,taskName,isSynCallBack); log.info("---->主类doSometing结束"); } //主任务中的回调任务,将在任务类中被调用 public void betweenTask(){ log.info(">>>主类betweenTask开始,休眠2秒"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info(">>>主类betweenTask结束"); } //主任务中的另一个回调任务,将在任务类中被调用 public void afterTask(){ log.info(">>>主类afterTask被调用"); } } /** * 任务计算类 * 接受主类的任务调用,调用方法的传参中包括主类对象,形如(MainClass mainClass,...) * 在任务执行过程的某个节点,如某个中间节点或完成后,通过传参进来的主类对象调用主类的某个方法,此所谓回调 */ class TaskClass{ private final static Logger log = LoggerFactory.getLogger(TaskClass.class); //来自主类的计算任务 public void runATask(MainClass mainClass,String taskName,boolean isSynCallBack){ //任务计算 log.info("任务类runATask方法被主类调用,任务名[{}]",taskName); log.info("任务类开始对主类进行"+(isSynCallBack?"[同步回调]":"[异步回调]")); //回调主类任务:同步回调或异步回调(此处所谓的同步异步相对的是任务类当前线程) if (isSynCallBack) { mainClass.betweenTask(); }else{ new Thread(new Runnable() { @Override public void run() { mainClass.betweenTask(); } }).start(); } //继续计算任务 log.info("任务类runATask结束"); //结束前同步回调另一个主类任务 mainClass.afterTask(); } }

 

最新回复(0)