In this specific case yes, but so is the await await as shown at <a href="https:&#x2F;&#x2F;youtu.be&#x2F;4OCUEgSNIAY?t=3545" rel="nofollow">https:&#x2F;&#x2F;youtu.be&#x2F;4OCUEgSNIAY?t=3545</a> in your linked talk.<p>The nice thing is that join is recursive in the quicksort example and that means its equivalent to the await await syntax in practical terms. Which also means when both are finished it will return.<p><pre><code>  let mid = partition(v);
      let (lo, hi) = v.split_at_mut(mid);
      Future:of(|| quick_sort::&lt;J,T&gt;(lo)).await(),
              Future:of(|| quick_sort::&lt;J,T&gt;(hi)).await());
</code></pre>
Is exactly the same in parallelism as this<p><pre><code>    let mid = partition(v);
    let (lo, hi) = v.split_at_mut(mid);
    J::join(|| quick_sort::&lt;J,T&gt;(lo),
            || quick_sort::&lt;J,T&gt;(hi));
</code></pre>
Except that join gives better scheduling due to work stealing which will avoid unbalanced cpu usage.<p>My Rust is non existent but conceptually Rayon is similar to java9 parallel streams which I know well.