当前位置: 首页 > 知识库问答 >
问题:

Java中的异步和同步回调

欧君之
2023-03-14

我正在尝试创建一个回调函数:

  1. 首先,我创建了一个函数接口,用于定义回调函数的约定
  2. 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用)

下面是我的代码:

@FunctionalInterface
interface OnDumpEventListener {
    void onDumpEvent();
}
class SynchronousCallback {
    void doStuff(OnDumpEventListener callback) {
        System.out.println("i'm doing my work");

        if (callback != null) {
            callback.onDumpEvent();
        }
    }
}
class AsynchronousCallback {
    void doStuff(OnDumpEventListener callback) {
        System.out.println("i'm doing my work");
        try {
            wait(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if (callback != null) {
            new Thread(() -> {
                callback.onDumpEvent();
            }).start();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        SynchronousCallback x = new SynchronousCallback();
        x.doStuff(() -> System.out.println("callback doing his work"));

        AsynchronousCallback y = new AsynchronousCallback();
        y.doStuff(() -> System.out.println("callback doing his work asynch"));
    }
}

但当我运行这段代码时,我得到了这样的结果。

i'm doing my work
callback doing his work
i'm doing my work
Exception in thread "main" java.lang.IllegalMonitorStateException
    at java.base/java.lang.Object.wait(Native Method)
    at callbacks.AsynchronousCallback.doStuff(Main.java:22)
    at callbacks.Main.main(Main.java:41)

有人能告诉我为什么我会有这个例外吗?

共有1个答案

邹坚壁
2023-03-14

方法wait/notify/notifyAll必须在synchronized块内调用。

 类似资料:
  • 问题内容: 同步和异步AJAX调用有什么区别?何时使用同步以及何时异步? 问题答案: 在最基本的级别上,当您希望调用在后台发生时,您可以使用异步模式,而当您希望代码等待直到调用完成时,则可以使用同步模式。 异步模式是AJAX调用的常用方法,因为通常在事件上附加一个回调函数,以便您可以在服务器端数据就绪时进行响应,而不必等待数据到达。

  • 我有endpoint,它可以返回同步和异步结果 如何刻意返回某物,即同步?

  • 本文向大家介绍jquery中的ajax同步和异步详解,包括了jquery中的ajax同步和异步详解的使用技巧和注意事项,需要的朋友参考一下 之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题。最近的项目用了到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假

  • 问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:

  • 本文向大家介绍详解java 三种调用机制(同步、回调、异步),包括了详解java 三种调用机制(同步、回调、异步)的使用技巧和注意事项,需要的朋友参考一下 1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口; 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到

  • 本文向大家介绍举例说明同步和异步相关面试题,主要包含被问及举例说明同步和异步时的应答技巧和注意事项,需要的朋友参考一下 考察点:线程 如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁就是最好的例子)。当应用程序在对象上调用了一个需要花费很长时间来