Java回调函数异步回调案例

1、回调函数分类

回调函数区分:同步回调和异步回调

同步回调:意义只在于完成方法调用;

异步调用:可实现并发,主业务线程可以及时释放;异步线程完成工作,执行回调函数,完成善后工作;提高了执行效率。

2、代码示例

1、注测试类

package com.callback2;

public class AsyncCallBack {

    public static void main(String[] args) {
        System.out.println("业务主线程开始ID:" + Thread.currentThread().getId());
        System.out.println("------------------");

        Son son = new Son();
        Mother mother = new Mother(son);

        mother.notice();
        son.writeHomeWork();

        System.out.println("业务主线程结束ID:" + Thread.currentThread().getId()+"\n");

    }

}

2、母亲 

package com.callback2;

public class Mother {
    private Son son;
    public Mother(Son son) {
        this.son = son;
    }

    public void notice() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("通知母亲线程ID:" + Thread.currentThread().getId());
                cookFood("面包");
            }
        }).start();
    }

    public void cookFood(String bread) {
        System.out.println("目前做饭线程ID:" + Thread.currentThread().getId());
        try {
            System.out.println("母亲烤制" + bread + "中...");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("母亲烤好了面包");
        String message = "小明,来吃饭了!";

        son.callback(message);

    }

}

3、儿子小明 

package com.callback2;

public class Son {
    private String status = "";

    public void writeHomeWork() {
        System.out.println("小明写作业线程ID:" + Thread.currentThread().getId());
        System.err.println("小明写作业中...");
        setStatus("写作业中");
    }


    public void callback(String message) {
        System.out.println("回调小明吃饭线程ID:" + Thread.currentThread().getId());
        System.err.println(message);
        System.err.println("好的,马上来!");
        System.out.println("小明开始吃饭!");
        setStatus("吃饭中");
        System.out.println("小明执行吃饭线程ID:" + Thread.currentThread().getId());
    }

    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

4、执行结果

业务主线程开始ID:1
------------------
小明写作业线程ID:1
小明写作业中...
业务主线程结束ID:1

通知母亲线程ID:12
目前做饭线程ID:12
母亲烤制面包中...
母亲烤好了面包
回调小明吃饭线程ID:12
小明,来吃饭了!
好的,马上来!
小明开始吃饭!
小明执行吃饭线程ID:12

5、结果分析

1) 小明使用主线程写作业(写完写不完,不需要关心);

2) 母亲使用新线程做饭【并发】,母亲做完饭,执行回调函数,通知小明吃饭;

3) 小明使用新线程,开始吃饭。

 

你可能感兴趣的:(解决方案,JAVA基础)