Java 8 Streams are pull based. You iterate over a javaJava 8 stream consuming each item. And it could be an endless stream.
RXJava ObservableObservable is by default push based. You subscribe to an Observable and you will get notified when the next item arrives (onNextonNext), or when the stream is completed (onCompletedonCompleted), or when an error occuredoccurred (onErroronError). Because with ObservableObservable you receive onNextonNext, onCompletedonCompleted, onErroronError events, you can do some powerfullpowerful functions like combining different ObservablesObservables to a new one (zipzip, mergemerge, concatconcat). Other stuff you could do is caching, throttling, ... And it uses more or less the same apiAPI in different languages (rxjavaRxJava, RX in C#, rxjsRxJS, ...)
By default RXJavaRxJava is single threaded. Unless you start using Schedulers, everything will happen on the same thread.