📜  Java中的异步和同步回调(1)

📅  最后修改于: 2023-12-03 15:32:00.108000             🧑  作者: Mango

Java中的异步和同步回调

在Java中,回调是一种非常常见的设计模式,它允许程序在异步操作完成后通知其他部分,或在某些事件发生时立即执行某些操作。回调分为同步回调和异步回调。本文将深入探讨Java中的异步和同步回调。

同步回调

同步回调是在方法调用者的线程中执行的回调。在同步回调中,方法调用者向被调用者传递一个回调函数,并在执行完该函数后继续执行下一个代码行。同步回调是一种顺序执行的回调。示例代码如下:

public class SynchronousCallbackExample {
    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.doWork(new Callback() {
            @Override
            public void onComplete() {
                System.out.println("任务已完成");
            }
        });
        System.out.println("主线程执行");
    }
}

interface Callback {
    void onComplete();
}

class Worker {
    public void doWork(Callback callback) {
        // 模拟工作
        for (int i = 1; i <= 5; i++) {
            System.out.println("工作进度:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        callback.onComplete();
    }
}

运行上述代码,输出结果如下:

工作进度:1
工作进度:2
工作进度:3
工作进度:4
工作进度:5
任务已完成
主线程执行

从输出结果中可以看出,工作进度是顺序执行的,而回调是在工作完成后运行的。在同步回调中,如果回调函数执行时间过长,可能会阻塞主线程,因此建议在进行回调时使用异步方式。

异步回调

异步回调是在新线程中执行的回调,因此不会阻塞主线程。在异步回调中,方法调用者向被调用者传递一个回调函数,在调用完成后,被调用者会开启一个新线程,并在该线程中执行回调函数。示例代码如下:

public class AsynchronousCallbackExample {
    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.doWork(new Callback() {
            @Override
            public void onComplete() {
                System.out.println("任务已完成");
            }
        });
        System.out.println("主线程执行");
    }
}

interface Callback {
    void onComplete();
}

class Worker {
    public void doWork(Callback callback) {
        // 创建新线程
        new Thread(() -> {
            // 模拟工作
            for (int i = 1; i <= 5; i++) {
                System.out.println("工作进度:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            callback.onComplete();
        }).start();
    }
}

运行上述代码,输出结果如下:

工作进度:1
主线程执行
工作进度:2
工作进度:3
工作进度:4
工作进度:5
任务已完成

从输出结果中可以看出,主线程和工作线程是并行进行的,回调函数在工作完成后在新线程中执行。

总结

同步回调和异步回调都在Java的回调中占据一席之地,每个回调类型都有自己的应用场景。同步回调适用于简单的应用场景,而异步回调则更适用于需要协调的操作。在使用回调时,应根据实际需求选择正确的回调类型。