Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步编程与反应式编程_Java_Asynchronous_Reactive Programming - Fatal编程技术网

Java 异步编程与反应式编程

Java 异步编程与反应式编程,java,asynchronous,reactive-programming,Java,Asynchronous,Reactive Programming,这个问题在我脑海里大约有一年了。实际上,异步和非阻塞有什么区别吗。当我们在代码中调用阻塞部分时,它就变成了阻塞,这是同步的,同时也不是非阻塞的 如果我们在主线程之外创建另一个线程来进行异步编程,我们必须返回一些值,因此我们必须在java中定义join()方法,并且join()是阻塞操作,那么它实际上是异步的吗 我需要知道以下问题的答案 如果阻塞类似于同步,那么异步和非阻塞之间有什么不同。应该类似吗?若否,原因为何 无阻塞的反应式编程是完全异步编程吗 考虑两种并行算法,生产者和消费者。若消费者

这个问题在我脑海里大约有一年了。实际上,异步和非阻塞有什么区别吗。当我们在代码中调用阻塞部分时,它就变成了阻塞,这是同步的,同时也不是非阻塞的

如果我们在主线程之外创建另一个线程来进行异步编程,我们必须返回一些值,因此我们必须在java中定义
join()
方法,并且
join()
是阻塞操作,那么它实际上是异步的吗

我需要知道以下问题的答案

  • 如果阻塞类似于同步,那么异步和非阻塞之间有什么不同。应该类似吗?若否,原因为何

  • 无阻塞的反应式编程是完全异步编程吗


  • 考虑两种并行算法,生产者和消费者。若消费者的工作速度比生产者快,我们必须阻止消费者算法,直到生产者提供新数据。通常,我们有两种方法阻止消费者:

  • 将使用者实现为线程,并阻止该线程
  • 将使用者实现为任务,在线程池上运行,并从该任务返回(并在数据准备就绪时告诉生产者重新启动该任务)
  • 实现使用者的第一种方法是同步的,第二种是异步的

    现在考虑一个相反的例子:生产者比消费者快。同样,我们有两个选项来阻止生产者:

  • 将producer实现为线程并阻止该线程
  • 将producer实现为一个任务,在线程池上运行,并从该任务返回(并告诉使用者在能够接收数据时重新启动producer任务)
  • 当然,第一个选项是同步的,第二个是异步的。第二个定义快速生产者和慢速消费者之间交互的异步选项称为反应式编程

    因此,反应式编程是异步编程的一个子集。有许多不同的协议来定义异步活动之间的交互,而反应式编程只是其中之一,它无法涵盖异步通信的所有可能情况


    我试图在模块中收集异步协议。可以(重新)发明其他协议,例如,带或不带背压的字节流,模拟到同步和同步。我确信任何同步协议都有它的异步类似物。

    它们密切相关,但反应式协议也“懒惰”;请参阅背压的概念。正如您在第2点中为更快的生产者解释的那样,它给人的印象是消费者正在从生产者那里获取数据。但是反应式编程是关于推模式的,不是吗?