Java 中的异步事件调度

2024-03-19

我正在将 C# 程序移植到 Java,该程序大量使用委托和委托的BeginInvoke异步通知事件的方法。以数据通信线程为例。它可能必须将其状态以及 GUI 通知给另一个工作线程。

在我看来,通知不同班级的各种事件的最佳方法是有一个IClassNameHereWatcher接口定义了“发布”事件的类需要通知的所有事件类型,然后每个需要侦听的类将实现此接口并将自身注册为侦听器。我不太确定的是如何使其异步。我所指的内容大致如下:

public interface IFrobWatcher {
    void frobDidSomething();
    void frobReceivedData(object data);
}

public class Frob implements Runnable {
    List<IFrobWatcher> watchers = new ArrayList<IFrobWatcher>();

    private void run() {
        while (true) {
            // Long running task
            if (blah) notifyWeDidSomething();
            notifyOfData(someDataObject);
        }
    }

    public void addWatcher(IFrobWatcher watcher) {
        watchers.Add(watcher);
    }

    private void notifyWeDidSomething() {
        for (IFrobWatcher watcher : watchers) {
            watcher.frobDidSomething(); // How do I make this asynchronous?
        }
    }

    private void notifyOfData(object someDataObject) {
        for (IFrobWatcher watcher : watchers) {
            watcher.frobReceivedData(someDataObject); // How do I make this asynchronous?
        }
    }

}

public class FrobWatcher implements IFrobWatcher {
    private Frob frobToWatch;

    public FrobWatcher(Frob frob) {
        frobToWatch = frob;
        frobToWatch.addListener(this);
    }

    public void FrobDidSomething() {
        System.out.println("Frob did something!");
    }

    public void FrobReceivedData(object received) {
        System.out.println("Frob received: " + received.ToString());
    }

    public static void main(string[] args) {
        Frob f = new Frob();
        FrobWatcher fw = new FrobWatcher(f);
        (new Thread(f)).start();
    }
}

这是一个相当简单的示例,但希望它能传达我正在寻找的内容。如果有些内容不清楚或没有意义,请发表评论,我将尝试澄清或修复该示例。


我会推荐 java.util.concurrent 包中的执行器。 这就是异步回调的处理方式猛禽框架 http://github.com/schildmeijer/raptor/blob/master/src/main/java/org/raptorframework/raptor/AsyncFileMonitor.java:

scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(
    filesPoller, 0 /*initial delay*/,
    checkInterval,
    TimeUnit.MILLISECONDS
);

注意。该调度是重复进行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的异步事件调度 的相关文章

随机推荐

  • 哪些 R 函数不适合编程使用?

    一些函数如browser仅在交互使用时才有意义 人们普遍认为subset功能只能交互使用 https stackoverflow com q 9860090 134830 相似地 sapply不适合编程使用 因为它不能简化零长度输入的结果
  • 使用javascript将Base64转换为图像文件

    有谁知道我可以使用任何简单的javascript将base64字符串转换为图像 最好是jpg格式 以便我可以将图像保存到文件中 这是针对签名板应用程序的 我可以将签名转换为 base64 格式 但需要将签名另存为图像文件以用于嵌入到 Cry
  • ggplot - 集中facet_grid标题并仅出现一次[重复]

    这个问题在这里已经有答案了 我已经创建了一个图表ggplot里面有两个变量facet grid 我希望每个方面的标题仅在该方面的中心重复一次 例如 第一个原始 上刻面 中的零和一将仅出现一次并且出现在中间 在我的原始图中 每个方面的图数不相
  • Android Java——在Android平台上反序列化文件

    我有一个 java 程序 可以序列化稍后存储和读取的文件 因此 我获取序列化文件并尝试使用与 Java SE 中使用的完全相同的代码在我的 Android 手机 在 Eclipse 中工作 上读取它们 FileInputStream fis
  • Java中如何连接字符串?

    The strKeyword将根据循环重复进行 如何将结果保存为新字符串 例如 如果工作 hello 重复两次 我现在如何将 hellohello 创建为全新的字符串 for int l 0 l lt newKeywordLength l
  • Azure CLI:无法在 Windows PowerShell 中转义管道字符 (|)

    Scenario 我尝试在 Windows 计算机上使用 Azure CLI 创建 Azure Web 应用程序 不幸的是 我无法为我的网络应用程序选择运行时 当我尝试时 az webapp create n name g grop p p
  • 如何在javascript中添加到所有浏览器的收藏夹/书签[重复]

    这个问题在这里已经有答案了 我在使用 java 脚本的 添加到收藏夹 书签网页 中有一些查询 我只是在这个中进行了查询Link http www apphp com index php snippet javascript add to f
  • NSURLSession 委托方法未调用

    我创建了一个非常简单的应用程序来从我的网络服务器下载文本文件 我可以与 NSURLConnection 完美配合 但我正在尝试迁移到 NSURLSession 我遇到的问题是没有调用任何委托方法 我的服务器受密码保护 因此我需要使用基本的
  • Mac Catalyst 上的应用程序内购买不起作用

    应用内购买对于我的 iOS 方面来说效果很好 StoreKit 中的数据已按其应有的方式填充 相同的代码不适用于该项目的 Mac Catalyst 版本 我什至在 App Store 上为我的 Mac 应用程序创建了一个列表 并与应用程序内
  • ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

    我正在开发一个相当标准的编译器项目 我选择 ANTLR 作为解析器生成器 在将现有语法从 v2 更新到 v3 时 我注意到 ANTLRWorks ANTLR 的官方 IDE 无法正确显示文件中的任何扩展 ASCII 字符 即使使用 Note
  • HTML Div 宽度溢出:自动?

    我正在创建一个div像下面这样 编辑 这是一个例子 table tr td div style max height 15em div td tr table
  • 无法加载文件或程序集“Oracle.DataAccessVersion=9.2.0.700,Culture=neutral,PublicKeyToken=89b483f429c47342”

    无法加载文件或程序集 Oracle DataAccess Version 9 2 0 700 Culture neutral PublicKeyToken 89b483f429c47342 或其依赖项之一 找到的程序集的清单定义与程序集引用
  • React Native Airbnb Markers:标记成功消失,但没有重新出现

    我目前正在使用 React Native 构建一个应用程序 并使用 Airbnb 地图插件来动态显示标记 我的标记已成功从 firebase 数据库下载 并且下载的数组始终显示正确的内容 我这里有完整的代码以防万一https codepen
  • 相当于android中的timeIntervalSinceReferenceDate

    有没有一种方法可以计算相对于日期的时间间隔 与 iPhone 中的 timeIntervalSinceReferenceDate 非常相似 谢谢 System currentTimeMillis 返回自 1970 年 1 月 1 日午夜以来
  • 使用 bootstrap/angularjs 可编辑组合框

    我没有得到任何将组合框作为选择和输入的解决方案 这意味着如果用户选择不在每个填充列表中 那么用户应该能够输入他的选择值 用户的选择 选择或输入 应该在 AngularJS 中作为 ng model 进行设置和检索 thanks ui sel
  • 在 Perl 中我应该使用什么来代替 printf ?

    我需要在 Perl 中使用一些字符串替换来简化翻译 即替换许多 print Outputting n numbers 通过类似的东西 printf Outputting d numbers n 但是 我想用更易于人类解析的内容替换 prin
  • 如何仅使用查找和替换来查找并计算字符串中子字符串的所有出现次数?

    输入需要更低 最后程序必须打印出现的次数 例如内存 smthing str input if smthing smthing lower smthing find mem 我对此彻底崩溃了 所以我无法走多远 我忘了告诉你我不能使用计数或列表
  • openlayers 3 可以使用 gif 渲染动画标记吗

    我想问如何让标记像 openlayers 2 一样显示动画 gif 图片 它可以显示动画标记 我想要的是显示动画 gif 标记而不使标记移动 这可能吗 style anchorXUnits fraction anchorYUnits pix
  • 如何在 Emacs 中为 LaTeX 模式定义两个 ispell 字典?

    我有一份包含许多第二语言引文的文档 我如何将第二语言定义为 Ispell 我在文件顶部有这个 Local IspellDict brasileiro 我尝试了这个 但没有成功 Local IspellDict brasileiro engl
  • Java 中的异步事件调度

    我正在将 C 程序移植到 Java 该程序大量使用委托和委托的BeginInvoke异步通知事件的方法 以数据通信线程为例 它可能必须将其状态以及 GUI 通知给另一个工作线程 在我看来 通知不同班级的各种事件的最佳方法是有一个IClass