多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## CompletableFuture类 作为介绍,这里是使用CompletableFutures在QuittingTasks.java中: ```java // concurrent/QuittingCompletable.java import java.util.*; import java.util.stream.*; import java.util.concurrent.*; import onjava.Nap; public class QuittingCompletable { public static void main(String[] args) { List<QuittableTask> tasks = IntStream.range(1, QuittingTasks.COUNT) .mapToObj(QuittableTask::new) .collect(Collectors.toList()); List<CompletableFuture<Void>> cfutures = tasks.stream() .map(CompletableFuture::runAsync) .collect(Collectors.toList()); new Nap(1); tasks.forEach(QuittableTask::quit); cfutures.forEach(CompletableFuture::join); } } ``` 输出结果: ``` 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2526 27 28 29 30 31 32 33 34 6 35 4 38 39 40 41 42 43 4445 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 6263 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 8081 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 9899 100 101 102 103 104 105 106 107 108 109 110 111 1121 113 114 116 117 118 119 120 121 122 123 124 125 126127 128 129 130 131 132 133 134 135 136 137 138 139 140141 142 143 144 145 146 147 148 149 5 115 37 36 2 3 ``` 任务是一个 `List<QuittableTask>`,就像在 `QuittingTasks.java` 中一样,但是在这个例子中,没有 `peek()` 将每个 `QuittableTask` 提交给 `ExecutorService`。相反,在创建 `cfutures` 期间,每个任务都交给 `CompletableFuture::runAsync`。这执行 `VerifyTask.run()` 并返回 `CompletableFuture<Void>` 。因为 `run()` 不返回任何内容,所以在这种情况下我只使用 `CompletableFuture` 调用 `join()` 来等待它完成。 在本例中需要注意的重要一点是,运行任务不需要使用 `ExecutorService`。而是直接交给 `CompletableFuture` 管理 (不过你可以向它提供自己定义的 `ExectorService`)。您也不需要调用 `shutdown()`;事实上,除非你像我在这里所做的那样显式地调用 `join()`,否则程序将尽快退出,而不必等待任务完成。 这个例子只是一个起点。你很快就会看到 `ComplempleFuture` 能够做得更多。