java - 回调和事件的区别

标签 java asynchronous synchronous

异步和同步编程中的回调和事件有什么区别?

我对同步编码标准的理解是,回调是在每个事件代码段之后执行的一段代码?并且直到执行最后一段回调代码后才会调用下一个事件。正确吗?

其次,在异步编码中,一旦执行了事件代码,就会调用回调代码。并且无论最后的回调代码是否被执行,它都会调用下一个事件和相应的回调等等。正确吗?

我认为回调可以充当对事件代码执行片段的确认(也可能是其他意义)。

我正在阅读此博客https://www.geeksforgeeks.org/asynchronous-synchronous-callbacks-java/

我在哪里找到下面关于异步的陈述并且无法正确理解?

An Asynchronous call does not block the program from the code execution. When the call returns from the event, the call returns back to the callback function.

这是否意味着,当事件代码执行时,会调用回调代码?

// Java program to illustrate synchronous callback 
interface OnGeekEventListener { 

    // this can be any type of method 
    void onGeekEvent(); 
} 

class B { 

    private OnGeekEventListener mListener; // listener field 

    // setting the listener 
    public void registerOnGeekEventListener(OnGeekEventListener mListener) 
    { 
        this.mListener = mListener; 
    } 

    // my synchronous task 
    public void doGeekStuff() 
    { 

        // perform any operation 
        System.out.println("Performing callback before synchronous Task"); 

        // check if listener is registered. 
        if (this.mListener != null) { 

            // invoke the callback method of class A 
            mListener.onGeekEvent(); 
        } 
    } 

    // Driver Function 
    public static void main(String[] args) 
    { 
        B obj = new B(); 
        OnGeekEventListener mListener = new A(); 
        obj.registerOnGeekEventListener(mListener); 
        obj.doGeekStuff(); 
    } 
} 

class A implements OnGeekEventListener { 

    @Override
    public void onGeekEvent() 
    { 
        System.out.println("Performing callback after synchronous Task"); 
        // perform some routine operation 
    } 
    // some class A methods 
} 

最后一个疑问,在上面的代码中,如果事件代码(doGeekStuff())正在处理,并且另一个请求也来执行事件代码,则上面的代码将失败或等待当前事件处理要做的事?

最佳答案

事件可以是任何事情,例如您触摸手机屏幕、单击按钮、按下按键、丢失连接等。

回调是对这些事件的响应

在事件驱动编程中,我们得到回调方法,当某些事件发生时会调用该方法。

事件驱动编程通常使用称为观察者模式的设计模式来实现。

from head first design patters 回调基本上是通过观察者实现一个接口(interface)来实现的,事件驱动对象在每个事件中调用观察者上的回调方法,这些方法肯定是由观察者定义的,因为它实现了该接口(interface),接口(interface)是事件驱动对象和事件驱动对象之间的一种契约。观察者(嘿观察者,只有当您实现该接口(interface)时,我才会给您回调)

在您的代码中,该接口(interface)是

interface OnGeekEventListener { 
// this can be any type of method 
void onGeekEvent(); 
} 

当事件发生时,将在观察对象上调用onGeekEvent();

在上面的代码中,B 类是主体/生产者,当您在 B 类的实例上调用以下方法并传递您的对象时,如 classBobj.registerOnGeekEvent(classAobj) 它 < strong>将您注册为监听器/观察者/消费者,并将您的对象放入其 mListener 成员变量中,现在每当事件发生时,它都可以调用该对象上的 onGeekEvent() 方法。

 public void registerOnGeekEventListener(OnGeekEventListener mListener) 
{ 
    this.mListener = mListener; 
} 

同步回调当这些方法内的代码在事件对象调用它们的同一位置上运行时,它是同步的。

因此,如果在同一个线程上调用代码,则无法并行执行两个事件,因为线程是相同的,这就是为什么要写“直到执行最后一个回调”

例子 -> 就好像你只有一个 child ,你派他去取水,然后你可以派他去取食物,直到他带着水回来(和你一样)无法执行另一个回调)

异步回调当这些方法中的代码运行在不同的线程上,或者可能在其他计算机上运行时(在后面的情况下,您是该其他计算的观察者)

因此,如果您在每个回调中生成一个新线程,那么所有这些回调都可以并行执行

示例 -> 就好像你有很多 child ,你派一个 child 去取水,而他去取水时,所以派另一个 child 去拿食物,然后另一个 child 给你送一杯咖啡,等等上

关于java - 回调和事件的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913687/

相关文章:

java - IOException 不执行任何操作

python - 如何将 Celery 与 asyncio 结合使用?

iphone - 使用 iOS 异步上传音频文件

javascript - Vuejs 在渲染数据之前同步请求

java - 从与用户输入匹配的数组列表元素中选择

java - 在 Android 中使用 javaagent

java - 在 Swing 中显示一个弹出窗口,指示程序启动的进度

ruby-on-rails - Sidekiq:perform_async 和顺序相关操作

node.js - Nodejs 识别异步任务的输出

io - open(2) 中的 O_SYNC 和 O_DIRECT 标志有何不同/相似?