diff --git a/rxjava/pom.xml b/rxjava/pom.xml
new file mode 100644
index 0000000000..63aa1f127e
--- /dev/null
+++ b/rxjava/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ rxjava
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ io.reactivex
+ rxjava
+ ${rx.java.version}
+
+
+
+
+ 1.2.5
+
+
+
\ No newline at end of file
diff --git a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java
new file mode 100644
index 0000000000..cebc2d35f6
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java
@@ -0,0 +1,44 @@
+package com.baelding.rxjava;
+
+
+import rx.Observable;
+import rx.Subscriber;
+import rx.schedulers.Schedulers;
+
+public class ColdObservableBackPressure {
+ public static void main(String[] args) throws InterruptedException {
+ Observable.range(1, 1_000_000)
+ .observeOn(Schedulers.computation())
+ .subscribe(v -> ComputeFunction.compute(v), Throwable::printStackTrace);
+
+ Thread.sleep(10_000);
+
+
+// Observable.range(1, 1_000_000) //implementation of reactive pull backpressure on cold observable
+// .subscribe(new Subscriber() {
+// @Override
+// public void onStart() {
+// request(1);
+// }
+//
+// public void onNext(Integer v) {
+// compute(v);
+//
+// request(1);
+// }
+//
+// @Override
+// public void onError(Throwable ex) {
+// ex.printStackTrace();
+// }
+//
+// @Override
+// public void onCompleted() {
+// System.out.println("Done!");
+// }
+// });
+
+ }
+
+
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java b/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java
new file mode 100644
index 0000000000..bebccd0300
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java
@@ -0,0 +1,45 @@
+package com.baelding.rxjava;
+
+
+import rx.Observable;
+
+import java.util.List;
+
+public class ComputeFunction {
+ public static void compute(Integer v) {
+ try {
+ System.out.println("compute integer v: " + v);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void compute(List v) {
+ try {
+ System.out.println("compute integer v: " + v);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void compute(Observable v) {
+ try {
+ v.forEach(System.out::println);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ public static void compute(Long v) {
+ try {
+ System.out.println("compute integer v: " + v);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureBatching.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureBatching.java
new file mode 100644
index 0000000000..c13f94c4f7
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureBatching.java
@@ -0,0 +1,21 @@
+package com.baelding.rxjava;
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+public class HotObservableBackPressureBatching {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.window(500)
+ .observeOn(Schedulers.computation())
+ .subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureBuffering.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureBuffering.java
new file mode 100644
index 0000000000..67922e2efb
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureBuffering.java
@@ -0,0 +1,22 @@
+package com.baelding.rxjava;
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+
+public class HotObservableBackPressureBuffering {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source
+ .buffer(1024)
+ .observeOn(Schedulers.computation())
+ .subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureSkipping.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureSkipping.java
new file mode 100644
index 0000000000..2e8244166f
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackPressureSkipping.java
@@ -0,0 +1,23 @@
+package com.baelding.rxjava;
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+import java.util.concurrent.TimeUnit;
+
+public class HotObservableBackPressureSkipping {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.sample(100, TimeUnit.MILLISECONDS)
+// .throttleFirst(100, TimeUnit.MILLISECONDS)
+ .observeOn(Schedulers.computation())
+ .subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java
new file mode 100644
index 0000000000..bf86312fff
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java
@@ -0,0 +1,28 @@
+package com.baelding.rxjava;
+
+
+import rx.BackpressureOverflow;
+import rx.Observable;
+import rx.schedulers.Schedulers;
+
+public class HotObservableOnBackPressure {
+ public static void main(String[] args) throws InterruptedException {
+ Observable.range(1, 1_000_000)
+ .onBackpressureBuffer(16, () -> {
+ },
+ BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST)
+ .observeOn(Schedulers.computation())
+ .subscribe(e -> {
+ }, Throwable::printStackTrace);
+
+
+ Observable.range(1, 1_000_000)
+ .onBackpressureDrop()
+ .observeOn(Schedulers.io())
+ .doOnNext(ComputeFunction::compute)
+ .subscribe(v -> {
+ }, Throwable::printStackTrace);
+ Thread.sleep(10_000);
+
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackPressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackPressure.java
new file mode 100644
index 0000000000..07ff5b42c0
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackPressure.java
@@ -0,0 +1,20 @@
+package com.baelding.rxjava;
+
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+public class HotObservableWithoutBackPressure {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.observeOn(Schedulers.computation())
+ .subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+}