To answer the second question, here is a problem that can benefit a lot from Rx. It's called "Get rich quick".
You have developed a game by the same name and it's selling pretty well. But it is available only at your stores for wholesale. To make the cash processing easier, you have a conveyor belt which flows towards you.
(Please feel free to change the story above :) )
Sales people place bound wads of cash on it with no labels indicating the amount and type of bills in the wad. Your job is to sort and count the money. Later on, when you get more money, you can hire others to help you.
In this case, the source is an asynchronous source of wads of cash (Producer).
Your employees and suppliers expect money, but you have to consume the wads, unpack them and use your custom business logic to repackage as appropriate to pay them.
The sales people are running on their own thread, so that they don't have to wait for you to count what they throw on the belt. Your time is best utilized if you are told when more money is available to count, until then you can do other work.
You could represent each wad by a byte[].
This is a fairly common real world situation; when you retrieve any resource [for example, webpages for search engines, images or videos] on a network or data from peripherals, you get them in chunks of bytes (possibly with headers). In a single thread, or in a multi-thread environment that is too difficult to work with, you tend to aggregate and process them. Not any more!!