1、Kafka回调函数的使用:
明显看出上图出现执行完外层后执行完回调。
2、回调函数大多是异步的,如何理解异步呢?指的是在一个main函数调用后新产生了一个线程,这个线程独立于main函数的线程之外运行,不影响现有的main线程运行,是异步执行的。
注意:异步操作不一定需要使用两个或以上的线程。在某些情况下,异步操作可以在单线程中完成,比如使用 Java 的定时器或者事件循环机制。异步操作是否需要使用多线程取决于具体的应用场景和需求。
常见的异步多使用如下类或方式实现:
Java中提供的Thread、Future和CompletableFuture类,还有一些其他的类也可以用来实现异步操作。
其中,ExecutorService是一个非常常用的类,它提供了线程池的实现,可以帮助我们更方便地管理线程。我们可以通过ExecutorService的submit()方法来提交一个异步任务,该方法会返回一个Future对象,可以用来等待异步任务的完成并获取结果。
另外,Java中的Timer和TimerTask类也可以用来实现定时任务的异步执行。Timer类允许我们在指定的时间后执行一项任务,而TimerTask则表示一个可以调度的任务。
除了上述类,还有一些开源的异步框架和库,如Netty、RxJava、Vert.x等,这些框架和库提供了更高级别的异步API和工具,可以帮助我们更方便地处理异步操作和事件驱动编程。
简易异步代码以及解释:
import static org.assertj.core.util.DateUtil.now;
public class AsyncExample {
public static void main(String[] args) {
// 创建异步任务
AsyncTask task = new AsyncTask();
// 执行异步任务
task.execute(10);
// 主线程可以继续执行其他操作
System.out.println("Main thread continues to run...");
}
}
class AsyncTask {
public void execute(int n) {
// 创建一个新的线程执行任务
Thread t = new Thread(() -> {
System.out.println("Async task begin in :"+now());
// 执行计算任务
int result = fibonacci(n);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 异步任务完成后,打印结果
System.out.println("Async task finished in :"+now()+ "\n" +"result = "+result);
});
t.start();
}
private int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
}
运行结果:
import java.util.Timer;
import java.util.TimerTask;
public class TimerExample {
public static void main(String[] args) {
// 创建定时器
Timer timer = new Timer();
// 在5000毫秒后执行任务
timer.schedule(new MyTask(), 5000);
// 主线程可以继续执行其他操作
System.out.println("Main thread continues to run...");
}
}
class MyTask extends TimerTask {
public void run() {
// 执行任务
System.out.println("Async task finished.");
}
}
运行结果: