【问题标题】:Asynchronous programming using Java使用 Java 进行异步编程
【发布时间】:2011-01-19 01:12:59
【问题描述】:

在哪里可以找到使用 Java 的异步编程示例?我有兴趣在异步编程中寻找模式,以构建具有响应性(防止应用程序定期挂起和停止响应用户输入以及服务器应用程序不及时响应客户端请求)和可扩展性的应用程序。

特别是查看执行 I/O 操作(例如文件读/写、Web 请求和数据库查询)并且还涉及大量 CPU 处理(例如网页中的购物建议)的示例将很有帮助.

哪些 Java 库可以帮助确定应用程序的响应能力何时不可预测 - 因为应用程序的线程执行 I/O 请求,所以应用程序基本上放弃了对 I/O 设备线程处理的控制(很难驱动器、网络或其他)

【问题讨论】:

    标签: java asynchronous event-driven-design


    【解决方案1】:

    在 GUI 中,您可以使用线程来执行后台任务。

    Java 在新的 I/O API (NIO) 中支持非阻塞 I/O。

    如果您的问题更面向架构,本书将深入讨论异步模式:企业应用程序架构的模式,作者 Martin Fowler。

    【讨论】:

    • 感谢...并发/Martin Fowler 和 David Rice 的章节很不错..但更多的是讨论面向数据库的问题..
    【解决方案2】:

    对于在文件上执行非阻塞 IO 的异步操作的示例,您可以在此处查看一些示例:https://github.com/javasync/idioms(免责声明我是作者)。

    我在介绍 Java 中的异步编程时使用了这些示例,我们探索了基于回调的 CompletableFuture,最后是反应式流

    【讨论】:

      【解决方案3】:

      哪些 Java 库可以帮助确定应用程序的响应能力何时不可预测 - 因为应用程序的线程执行 I/O 请求,所以应用程序基本上放弃了对 I/O 设备线程处理的控制(很难驱动器、网络或其他)

      如果我对您的理解正确,您需要一些库来检查其他线程以确定它们是否在 I/O 调用中被阻塞。

      我认为这在标准 JVM 中是不可能的。此外,我认为这不一定足以保证“响应能力”。

      【讨论】:

      • 是的,实际上都是:知道阻塞调用......然后是允许异步 I/O 和处理多个模块同时运行的库
      • 我想从主线程确定应用程序的响应何时是不可预测的,以便我可以决定如何从程序中处理它
      【解决方案4】:

      如果您正在使用某种 I/O 操作(例如在 InputStream 上读取,可能会阻塞)您将其放入线程中,最简单的解决方案是在线程上使用给定数量的 join:

      MyThread myThread = new MyThread(); 
      myThread.start();
      myThread.join(10000);
      

      然后,此加入将等待最多 10 秒。在那之后,您可以忽略该线程,... 您也可以使用Decorator pattern。你可以阅读更多here

      【讨论】:

        【解决方案5】:

        在 Web 环境中,您可以使用新的 j2ee6 异步功能。 看一眼 http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html

        【讨论】:

          猜你喜欢
          • 2016-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-29
          • 2013-04-11
          • 1970-01-01
          • 2015-03-16
          • 1970-01-01
          相关资源
          最近更新 更多