1. 程式人生 > >java之非同步回撥

java之非同步回撥

非同步回撥我的理解:

1.使用了委託模式,呼叫方(ServiceA)持有被呼叫方(ServiceB)的引用,然後呼叫被呼叫方(ServiceB)的方法,被呼叫方方法(ServiceB)完成後,呼叫呼叫方(ServiceA)的回撥函式做一些事情

2.非同步回撥多是一些耗時的操作,在新執行緒中去呼叫被呼叫方(ServiceB)方法

3.非同步回撥可以大大提高IO效率,這是當前開發的主流,比如Netty、Node大量使用非同步呼叫思想

4.多使用匿名內部類實現回撥

例項:

呼叫方(ServiceA)呼叫被呼叫方(ServiceB)方法建立使用者,建立完成後,被呼叫方(ServiceB)呼叫呼叫方(ServiceA)回撥函式做一些事情(寫資料庫、發訊息。。whatever)

回撥介面:
public interface CallBack {
    void process(String result);
}

ServiceA:

public class ServiceA {
    private ServiceB serviceB;

    public ServiceA(ServiceB serviceB) {
        this.serviceB = serviceB;
    }

    public void createUser(String userName) {
        serviceB.createUser(new CallBack() {
            @Override
            public void process(String desc) {
                System.out.println("serviceB返回訊息:" + desc);
            }
        }, userName);
    }
}

ServiceB:

public class ServiceB {

    public void createUser(CallBack callBack, final String userName) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("ServiceB建立使用者" + userName + "成功");
                callBack.process("建立使用者" + userName + "成功");
            }
        }).start();
    }
}

具體使用: 

public class BizUseTest {

    public static void main(String[] args) {
        ServiceB serviceB = new ServiceB();

        ServiceA serviceA = new ServiceA(serviceB);

        serviceA.createUser("kobe");
    }
}

執行結果:

ServiceB建立使用者kobe成功
serviceB返回訊息建立使用者kobe成功

如果能夠真正貫徹到專案中去,也是可以的