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==--