Re: Better RecursiveTask Example

Nathan Reynolds via Concurrency-interest <[email protected]> Thu, 25 Nov 2021 23:13:35 -0700
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <CALMUwcpkT=ksAnm2oCEtrt8nhhhXFhTKKMdaqqTHtwLJPPQx4A@mail.gmail.com>
--===============1058898722336175982==
Content-Type: multipart/alternative; boundary="0000000000008a2d8f05d1aafe3b"

--0000000000008a2d8f05d1aafe3b
Content-Type: text/plain; charset="UTF-8"

No "else"s are needed in compute() since the blocks have a return.

On Thu, Nov 25, 2021 at 11:43 AM Doug Lea via Concurrency-interest <
[email protected]> wrote:

> Thanks for the comments and suggestions. Here's pass 2, that tries to
> find a better compromise across concerns. Also pasted below without the
> leading "*"s in case you'd like to experience the copy-paste-run that
> people will be able to do.
>
>   * <p>For example, here is a task-based program for computing Factorials:
>   *
>   * <pre> {@code
>   * import java.util.concurrent.RecursiveTask;
>   * import java.math.BigInteger;
>   * public class Factorial {
>   *   static class FactorialTask extends RecursiveTask<BigInteger> {
>   *     private final int from, to;
>   *     FactorialTask(int from, int to) { this.from = from; this.to = to;
> }
>   *     protected BigInteger compute() {
>   *       if (from == to) {                       // base case
>   *         return BigInteger.valueOf(from);
>   *       } else if (to - from < 2) {             // too small to
> parallelize
>   *          return
> BigInteger.valueOf(from).multiply(BigInteger.valueOf(to));
>   *       } else {                                // split in half
>   *         int mid = from + (to - from) / 2;
>   *         FactorialTask leftTask = new FactorialTask(from, mid);
>   *         leftTask.fork();         // perform about half the work locally
>   *         return new FactorialTask(mid + 1, to).compute()
>   *                .multiply(leftTask.join());
>   *       }
>   *     }
>   *   }
>   *   static BigInteger factorial(int n) { // uses
> ForkJoinPool.commonPool()
>   *     return (n <= 1) ? BigInteger.ONE : new FactorialTask(1,
> n).invoke();
>   *   }
>   *   public static void main(String[] args) {
>   *     System.out.println(factorial(Integer.parseInt(args[0])));
>   *   }
>   * }}</pre>
>
>
> import java.util.concurrent.RecursiveTask;
> import java.math.BigInteger;
> public class Factorial {
>    static class FactorialTask extends RecursiveTask<BigInteger> {
>      private final int from, to;
>      FactorialTask(int from, int to) { this.from = from; this.to = to; }
>      protected BigInteger compute() {
>        if (to == from) {                       // base case
>          return BigInteger.valueOf(from);
>        } else if (to - from < 2) {             // too small to parallelize
>           return BigInteger.valueOf(from).multiply(BigInteger.valueOf(to));
>        } else {                                // split in half
>          int mid = from + (to - from) / 2;
>          FactorialTask leftTask = new FactorialTask(from, mid);
>          leftTask.fork();         // perform about half the work locally
>          return new FactorialTask(mid + 1, to).compute()
>                 .multiply(leftTask.join());
>        }
>      }
>    }
>    static BigInteger factorial(int n) { // uses ForkJoinPool.commonPool()
>      return (n <= 1) ? BigInteger.ONE : new FactorialTask(1, n).invoke();
>    }
>    public static void main(String[] args) {
>      System.out.println(factorial(Integer.parseInt(args[0])));
>    }
> }
>
> _______________________________________________
> Concurrency-interest mailing list
> [email protected]
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>

--0000000000008a2d8f05d1aafe3b
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

PGRpdiBkaXI9Imx0ciI+Tm8gJnF1b3Q7ZWxzZSZxdW90O3MgYXJlIG5lZWRlZCBpbiBjb21wdXRl
KCkgc2luY2UgdGhlIGJsb2NrcyBoYXZlIGEgcmV0dXJuLiA8YnI+PC9kaXY+PGJyPjxkaXYgY2xh
c3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gVGh1
LCBOb3YgMjUsIDIwMjEgYXQgMTE6NDMgQU0gRG91ZyBMZWEgdmlhIENvbmN1cnJlbmN5LWludGVy
ZXN0ICZsdDs8YSBocmVmPSJtYWlsdG86Y29uY3VycmVuY3ktaW50ZXJlc3RAY3Mub3N3ZWdvLmVk
dSI+Y29uY3VycmVuY3ktaW50ZXJlc3RAY3Mub3N3ZWdvLmVkdTwvYT4mZ3Q7IHdyb3RlOjxicj48
L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBw
eCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigyMDQsMjA0LDIwNCk7cGFkZGlu
Zy1sZWZ0OjFleCI+VGhhbmtzIGZvciB0aGUgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zLiBIZXJl
JiMzOTtzIHBhc3MgMiwgdGhhdCB0cmllcyB0byA8YnI+DQpmaW5kIGEgYmV0dGVyIGNvbXByb21p
c2UgYWNyb3NzIGNvbmNlcm5zLiBBbHNvIHBhc3RlZCBiZWxvdyB3aXRob3V0IHRoZSA8YnI+DQps
ZWFkaW5nICZxdW90OyomcXVvdDtzIGluIGNhc2UgeW91JiMzOTtkIGxpa2UgdG8gZXhwZXJpZW5j
ZSB0aGUgY29weS1wYXN0ZS1ydW4gdGhhdCA8YnI+DQpwZW9wbGUgd2lsbCBiZSBhYmxlIHRvIGRv
Ljxicj4NCjxicj4NCsKgwqAqICZsdDtwJmd0O0ZvciBleGFtcGxlLCBoZXJlIGlzIGEgdGFzay1i
YXNlZCBwcm9ncmFtIGZvciBjb21wdXRpbmcgRmFjdG9yaWFsczo8YnI+DQrCoMKgKjxicj4NCsKg
wqAqICZsdDtwcmUmZ3Q7IHtAY29kZTxicj4NCsKgwqAqIGltcG9ydCBqYXZhLnV0aWwuY29uY3Vy
cmVudC5SZWN1cnNpdmVUYXNrOzxicj4NCsKgwqAqIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdl
cjs8YnI+DQrCoMKgKiBwdWJsaWMgY2xhc3MgRmFjdG9yaWFsIHs8YnI+DQrCoMKgKsKgwqAgc3Rh
dGljIGNsYXNzIEZhY3RvcmlhbFRhc2sgZXh0ZW5kcyBSZWN1cnNpdmVUYXNrJmx0O0JpZ0ludGVn
ZXImZ3Q7IHs8YnI+DQrCoMKgKsKgwqDCoMKgIHByaXZhdGUgZmluYWwgaW50IGZyb20sIHRvOzxi
cj4NCsKgwqAqwqDCoMKgwqAgRmFjdG9yaWFsVGFzayhpbnQgZnJvbSwgaW50IHRvKSB7IHRoaXMu
ZnJvbSA9IGZyb207IDxhIGhyZWY9Imh0dHA6Ly90aGlzLnRvIiByZWw9Im5vcmVmZXJyZXIiIHRh
cmdldD0iX2JsYW5rIj50aGlzLnRvPC9hPiA9IHRvOyB9PGJyPg0KwqDCoCrCoMKgwqDCoCBwcm90
ZWN0ZWQgQmlnSW50ZWdlciBjb21wdXRlKCkgezxicj4NCsKgwqAqwqDCoMKgwqDCoMKgIGlmIChm
cm9tID09IHRvKSB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg
Ly8gYmFzZSBjYXNlPGJyPg0KwqDCoCrCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBCaWdJbnRlZ2Vy
LnZhbHVlT2YoZnJvbSk7PGJyPg0KwqDCoCrCoMKgwqDCoMKgwqAgfSBlbHNlIGlmICh0byAtIGZy
b20gJmx0OyAyKSB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8vIHRvbyBzbWFsbCB0byA8YnI+
DQpwYXJhbGxlbGl6ZTxicj4NCsKgwqAqwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiA8YnI+DQpC
aWdJbnRlZ2VyLnZhbHVlT2YoZnJvbSkubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKHRvKSk7
PGJyPg0KwqDCoCrCoMKgwqDCoMKgwqAgfSBlbHNlIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvLyBzcGxpdCBpbiBoYWxmPGJy
Pg0KwqDCoCrCoMKgwqDCoMKgwqDCoMKgIGludCBtaWQgPSBmcm9tICsgKHRvIC0gZnJvbSkgLyAy
Ozxicj4NCsKgwqAqwqDCoMKgwqDCoMKgwqDCoCBGYWN0b3JpYWxUYXNrIGxlZnRUYXNrID0gbmV3
IEZhY3RvcmlhbFRhc2soZnJvbSwgbWlkKTs8YnI+DQrCoMKgKsKgwqDCoMKgwqDCoMKgwqAgbGVm
dFRhc2suZm9yaygpO8KgwqDCoMKgwqDCoMKgwqAgLy8gcGVyZm9ybSBhYm91dCBoYWxmIHRoZSB3
b3JrIGxvY2FsbHk8YnI+DQrCoMKgKsKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIG5ldyBGYWN0b3Jp
YWxUYXNrKG1pZCArIDEsIHRvKS5jb21wdXRlKCk8YnI+DQrCoMKgKsKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoCAubXVsdGlwbHkobGVmdFRhc2suam9pbigpKTs8YnI+DQrCoMKgKsKgwqDC
oMKgwqDCoCB9PGJyPg0KwqDCoCrCoMKgwqDCoCB9PGJyPg0KwqDCoCrCoMKgIH08YnI+DQrCoMKg
KsKgwqAgc3RhdGljIEJpZ0ludGVnZXIgZmFjdG9yaWFsKGludCBuKSB7IC8vIHVzZXMgRm9ya0pv
aW5Qb29sLmNvbW1vblBvb2woKTxicj4NCsKgwqAqwqDCoMKgwqAgcmV0dXJuIChuICZsdDs9IDEp
ID8gQmlnSW50ZWdlci5PTkUgOiBuZXcgRmFjdG9yaWFsVGFzaygxLCBuKS5pbnZva2UoKTs8YnI+
DQrCoMKgKsKgwqAgfTxicj4NCsKgwqAqwqDCoCBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJp
bmdbXSBhcmdzKSB7PGJyPg0KwqDCoCrCoMKgwqDCoCBTeXN0ZW0ub3V0LnByaW50bG4oZmFjdG9y
aWFsKEludGVnZXIucGFyc2VJbnQoYXJnc1swXSkpKTs8YnI+DQrCoMKgKsKgwqAgfTxicj4NCsKg
wqAqIH19Jmx0Oy9wcmUmZ3Q7PGJyPg0KPGJyPg0KPGJyPg0KaW1wb3J0IGphdmEudXRpbC5jb25j
dXJyZW50LlJlY3Vyc2l2ZVRhc2s7PGJyPg0KaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOzxi
cj4NCnB1YmxpYyBjbGFzcyBGYWN0b3JpYWwgezxicj4NCsKgwqAgc3RhdGljIGNsYXNzIEZhY3Rv
cmlhbFRhc2sgZXh0ZW5kcyBSZWN1cnNpdmVUYXNrJmx0O0JpZ0ludGVnZXImZ3Q7IHs8YnI+DQrC
oMKgwqDCoCBwcml2YXRlIGZpbmFsIGludCBmcm9tLCB0bzs8YnI+DQrCoMKgwqDCoCBGYWN0b3Jp
YWxUYXNrKGludCBmcm9tLCBpbnQgdG8pIHsgdGhpcy5mcm9tID0gZnJvbTsgPGEgaHJlZj0iaHR0
cDovL3RoaXMudG8iIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPnRoaXMudG88L2E+
ID0gdG87IH08YnI+DQrCoMKgwqDCoCBwcm90ZWN0ZWQgQmlnSW50ZWdlciBjb21wdXRlKCkgezxi
cj4NCsKgwqDCoMKgwqDCoCBpZiAodG8gPT0gZnJvbSkge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8vIGJhc2UgY2FzZTxicj4NCsKgwqDCoMKgwqDCoMKgwqAg
cmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihmcm9tKTs8YnI+DQrCoMKgwqDCoMKgwqAgfSBlbHNl
IGlmICh0byAtIGZyb20gJmx0OyAyKSB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8vIHRvbyBz
bWFsbCB0byBwYXJhbGxlbGl6ZTxicj4NCsKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gQmlnSW50
ZWdlci52YWx1ZU9mKGZyb20pLm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZih0bykpOzxicj4N
CsKgwqDCoMKgwqDCoCB9IGVsc2Uge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8vIHNwbGl0IGluIGhhbGY8YnI+DQrCoMKgwqDC
oMKgwqDCoMKgIGludCBtaWQgPSBmcm9tICsgKHRvIC0gZnJvbSkgLyAyOzxicj4NCsKgwqDCoMKg
wqDCoMKgwqAgRmFjdG9yaWFsVGFzayBsZWZ0VGFzayA9IG5ldyBGYWN0b3JpYWxUYXNrKGZyb20s
IG1pZCk7PGJyPg0KwqDCoMKgwqDCoMKgwqDCoCBsZWZ0VGFzay5mb3JrKCk7wqDCoMKgwqDCoMKg
wqDCoCAvLyBwZXJmb3JtIGFib3V0IGhhbGYgdGhlIHdvcmsgbG9jYWxseTxicj4NCsKgwqDCoMKg
wqDCoMKgwqAgcmV0dXJuIG5ldyBGYWN0b3JpYWxUYXNrKG1pZCArIDEsIHRvKS5jb21wdXRlKCk8
YnI+DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLm11bHRpcGx5KGxlZnRUYXNrLmpv
aW4oKSk7PGJyPg0KwqDCoMKgwqDCoMKgIH08YnI+DQrCoMKgwqDCoCB9PGJyPg0KwqDCoCB9PGJy
Pg0KwqDCoCBzdGF0aWMgQmlnSW50ZWdlciBmYWN0b3JpYWwoaW50IG4pIHsgLy8gdXNlcyBGb3Jr
Sm9pblBvb2wuY29tbW9uUG9vbCgpPGJyPg0KwqDCoMKgwqAgcmV0dXJuIChuICZsdDs9IDEpID8g
QmlnSW50ZWdlci5PTkUgOiBuZXcgRmFjdG9yaWFsVGFzaygxLCBuKS5pbnZva2UoKTs8YnI+DQrC
oMKgIH08YnI+DQrCoMKgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHs8
YnI+DQrCoMKgwqDCoCBTeXN0ZW0ub3V0LnByaW50bG4oZmFjdG9yaWFsKEludGVnZXIucGFyc2VJ
bnQoYXJnc1swXSkpKTs8YnI+DQrCoMKgIH08YnI+DQp9PGJyPg0KPGJyPg0KX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188YnI+DQpDb25jdXJyZW5jeS1pbnRl
cmVzdCBtYWlsaW5nIGxpc3Q8YnI+DQo8YSBocmVmPSJtYWlsdG86Q29uY3VycmVuY3ktaW50ZXJl
c3RAY3Mub3N3ZWdvLmVkdSIgdGFyZ2V0PSJfYmxhbmsiPkNvbmN1cnJlbmN5LWludGVyZXN0QGNz
Lm9zd2Vnby5lZHU8L2E+PGJyPg0KPGEgaHJlZj0iaHR0cDovL2NzLm9zd2Vnby5lZHUvbWFpbG1h
bi9saXN0aW5mby9jb25jdXJyZW5jeS1pbnRlcmVzdCIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9
Il9ibGFuayI+aHR0cDovL2NzLm9zd2Vnby5lZHUvbWFpbG1hbi9saXN0aW5mby9jb25jdXJyZW5j
eS1pbnRlcmVzdDwvYT48YnI+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+DQo=
--0000000000008a2d8f05d1aafe3b--

--===============1058898722336175982==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest

--===============1058898722336175982==--