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();
}
}