2011年4月23日土曜日

Javaのコールバック

この投稿へのリンク
abstractでextendsしたクラスへのコールバック?と、interfaceを使ったコールバックだとabstractの方が早い。
Core-i5で5倍ほど差が出た。
多分Android上だともっと差がでるんだろうかな。




・AbstractThread.java
public abstract class AbstractThread extends Thread implements Runnable {

    abstract public void run();

}

・CallbackThread.java
public class CallbackThread extends Thread implements Runnable {

    public interface CallBack {
        void onCallback(int value);
    }

    private CallBack lis;

    void setCallBack(CallBack listener) {
        this.lis = listener;
    }

    @Override
    public void run() {

        long startTime = System.nanoTime();
        for (int i = 0; i < Main.LOOP; i++) {
            if (lis != null) {
                lis.onCallback(i);
            }
        }

        long procTime = System.nanoTime() - startTime;
        System.out.println("Callback:" + procTime / Main.LOOP + "[ns]");

    }

}
・Main.java
public class Main {

    public static void main(String[] args) {

        CallbackThread thread = new CallbackThread();

        CallbackThread.CallBack call = new CallBack() {

            @Override
            public void onCallback(int value) {
                // System.out.println(value);
            }
        };

        thread.setCallBack(call);
        thread.start();

        AbstractThread athread = new AbstractThread() {

            @Override
            public void run() {
                long startTime = System.nanoTime();
                for (int i = 0; i < LOOP; i++) {
                    // System.out.println(i);
                }

                long procTime = System.nanoTime() - startTime;
                System.out.println("Abstract:" + procTime / LOOP + "[ns]");
            }
        };
        athread.start();
    }
}