Cod*_*ove 3 java lambda java-8
我有一个方法TaskManager.newRepeatingTask(Runnable r, long delay, long interval),它返回一个UUID.我为该UUID方法返回的内容分配了一个变量,我想在其中使用该变量Runnable.我将如何有效地完成这项工作,或者我将在这里完成的工作?
UUID id = TaskManager.newRepeatingTask(() -> {
for (int i = 0; i < profileButtons.length; i++) {
GuiButton button = profileButtons[i];
button.move(-1, 0);
}
toMove--;
if (toMove == 0) {
// id: "The variable may not have been initialized"
TaskManager.cancelTask(id);
}
}, 30L, 0L);
Run Code Online (Sandbox Code Playgroud)
java.util.concurrent.CompletableFuture当您不确定哪个将首先到达时,使用(Java 8中的新增功能)在线程或任务之间传输值.这是如何做:
CompletableFuture<UUID> id = new CompletableFuture<>();
id.complete(TaskManager.newRepeatingTask(() -> {
for (int i = 0; i < profileButtons.length; i++) {
GuiButton button = profileButtons[i];
button.move(-1, 0);
}
toMove--;
if (toMove == 0) {
TaskManager.cancelTask(id.join());
}
}, 30L, 0L));
Run Code Online (Sandbox Code Playgroud)
该join()方法将收集并返回该complete()方法提供的值.如果complete()还没有被调用,join()将阻塞直到它.CompletableFuture在内部处理所有同步和内存可见性问题.
正如其他人所指出的那样,这有点人为.重复任务取消自身的更常规方法是让它返回一个布尔值,指示是否应该重新安排或取消它.要做到这一点,改TaskManager.newRepeatingTask()采取Supplier<Boolean>的不是Runnable.
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |