Clarify difference between runBlocking and coroutineScope
Fixes #1439
diff --git a/docs/basics.md b/docs/basics.md
index 6a1248b..13760a6 100644
--- a/docs/basics.md
+++ b/docs/basics.md
@@ -251,8 +251,14 @@
### Scope builder
In addition to the coroutine scope provided by different builders, it is possible to declare your own scope using
[coroutineScope] builder. It creates a coroutine scope and does not complete until all launched children
-complete. The main difference between [runBlocking] and [coroutineScope] is that the latter does not block the current thread
-while waiting for all children to complete.
+complete.
+
+[runBlocking] and [coroutineScope] may look similar because they both wait for its body and all its children to complete.
+The main difference between these two is that the [runBlocking] method _blocks_ the current thread for waiting,
+while [coroutineScope] just suspends, releasing the underlying thread for other usages.
+Because of that difference, [runBlocking] is a regular function and [coroutineScope] is a suspending function.
+
+It can be demonstrated by the following example:
<div class="sample" markdown="1" theme="idea" data-min-compiler-version="1.3">
@@ -290,6 +296,9 @@
Coroutine scope is over
-->
+Note that right after "Task from coroutine scope" message, while waiting for nested launch,
+ "Task from runBlocking" is executed and printed, though coroutineScope is not completed yet.
+
### Extract function refactoring
Let's extract the block of code inside `launch { ... }` into a separate function. When you