为了深入了解响应式编程,我尝试以一种非常简单的方式重新实现 RxJava Observable 类。这让我问了一些关于响应式(Reactive)编程方法的重要问题。 我想与您分享。
我没有得到的是:
响应式编程利用回调,然后繁重的异步操作由我们应用程序的工作线程(而不是主线程)实现。 此工作线程等待 I/O 操作、处理等,当它完成时,它会通过回调方法 回调调用者。 优点可能是主线程不必为了等待处理的响应而被阻塞,因为它是异步的并且因为它在进程完成时被回调。
我的问题是:
与简单的多线程相比有什么优势? 我的意思是,在多线程中没有回调,因此工作线程不会回调主线程,无论如何它会将结果返回给调用者(例如使用 Callable)。
这两种情况都有一个工作线程被阻塞以等待 I/O 操作或处理。
唯一的区别是回调而不是返回。
那我错过了什么?
最佳答案
“响应式编程使用回调”
不完全是。它是使用回调的异步编程,而响应式编程是异步编程的特例。实际上,您的问题一般涉及异步编程,并不涉及响应式(Reactive)编程的特殊性。
当线程运行时,它会在 Activity 状态和阻塞状态之间交替。在这两种状态下,线程都为其调用堆栈占用大量内存。异步过程应该仅在 Activity 状态下使用线程(和堆栈),并且不会在其阻塞状态下阻塞任何线程。这是异步编程的唯一区别和主要优势。
但是,不能阻止异步过程进行阻塞操作,例如阻塞 I/O 或 Semaphore.aquire()。在这种情况下,异步编程变成多线程编程并失去其优势。
异步编程的艺术是尽可能避免阻塞操作。尽管如此,如果一个程序执行阻塞操作,那么问题不在异步编程中,而是在程序员的资格或恶劣的环境中,例如。缺少异步 JDBC 驱动程序。
关于java - 深入理解Java中的Reactive Programming,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53171177/