1Kafka回调函数的使用:

 

 

 

 明显看出上图出现执行完外层后执行完回调。

 

2、回调函数大多是异步的,如何理解异步呢?指的是在一个main函数调用后新产生了一个线程,这个线程独立于main函数的线程之外运行,不影响现有的main线程运行,是异步执行的。

注意:异步操作不一定需要使用两个或以上的线程。在某些情况下,异步操作可以在单线程中完成,比如使用 Java 的定时器或者事件循环机制。异步操作是否需要使用多线程取决于具体的应用场景和需求。

  常见的异步多使用如下类或方式实现:

Java中提供的ThreadFutureCompletableFuture类,还有一些其他的类也可以用来实现异步操作。

其中,ExecutorService是一个非常常用的类,它提供了线程池的实现,可以帮助我们更方便地管理线程。我们可以通过ExecutorServicesubmit()方法来提交一个异步任务,该方法会返回一个Future对象,可以用来等待异步任务的完成并获取结果。

另外,Java中的TimerTimerTask类也可以用来实现定时任务的异步执行。Timer类允许我们在指定的时间后执行一项任务,而TimerTask则表示一个可以调度的任务。

除了上述类,还有一些开源的异步框架和库,如NettyRxJavaVert.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.");
    }
}

运行结果: