📅  最后修改于: 2023-12-03 15:32:00.108000             🧑  作者: Mango
在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的回调中占据一席之地,每个回调类型都有自己的应用场景。同步回调适用于简单的应用场景,而异步回调则更适用于需要协调的操作。在使用回调时,应根据实际需求选择正确的回调类型。