SubTask class
Пакет: com.hypixel.hytale.component.task
Файл: com/hypixel/hytale/component/task/ParallelRangeTask.java
extends: CountedCompleter<Void>
Поля (3)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private D |
data |
|
private int |
from |
|
private int |
to |
Методы (6)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public void |
computepublic void compute() |
|
|
for for(int var1 = this.from; var1 < this.to; var1++) |
|
D |
getDataD getData() |
|
void |
initvoid init(int var1, int var2) |
|
void |
setDatavoid setData(D var1) |
abstract |
|
super super(var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.component.task;
class="kw">import java.util.concurrent.CountedCompleter;
class="kw">import java.util.concurrent.ForkJoinPool;
class="kw">import java.util.function.IntConsumer;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">public class ParallelRangeTask<D class="kw">extends IntConsumer> class="kw">extends CountedCompleter<Void> {
class="kw">public class="kw">static class="kw">final int PARALLELISM = Math.max(ForkJoinPool.getCommonPoolParallelism(), 1);
class="kw">public class="kw">static class="kw">final int TASK_COUNT = Math.max(ForkJoinPool.getCommonPoolParallelism() << 2, 1);
@Nonnull
class="kw">private class="kw">final ParallelRangeTask.SubTask<D>[] subTasks = new ParallelRangeTask.SubTask[TASK_COUNT];
class="kw">private int size;
class="kw">public class="kw">volatile boolean running;
class="kw">public ParallelRangeTask(@Nonnull Supplier<D> var1) {
this(null, var1);
}
class="kw">public ParallelRangeTask(CountedCompleter<?> var1, @Nonnull Supplier<D> var2) {
super(var1);
for (int var3 = 0; var3 < this.subTasks.length; var3++) {
this.subTasks[var3] = new ParallelRangeTask.SubTask<>(this, var2.get());
}
}
@Override
class="kw">public void reinitialize() {
if (this.running) {
throw new IllegalStateException("ParallelRangeTask has already been started");
}
super.reinitialize();
}
@Nonnull
class="kw">public ParallelRangeTask<D> init(int var1, int var2) {
this.reinitialize();
int var3 = Math.max((var2 - var1 + (this.subTasks.length - 1)) / this.subTasks.length, 1);
for (this.size = 0; this.size < this.subTasks.length && var1 < var2; this.size++) {
int var4 = Math.min(var1 + var3, var2);
this.subTasks[this.size].init(var1, var4);
var1 = var4;
}
if (var1 < var2) {
throw new IllegalStateException("Failed to distribute the whole range to tasks!");
} else {
class="kw">return this;
}
}
class="kw">public int size() {
class="kw">return this.size;
}
class="kw">public D get(int var1) {
class="kw">return this.subTasks[var1].getData();
}
class="kw">public void set(int var1, D var2) {
if (this.running) {
throw new IllegalStateException("ParallelRangeTask has already been started");
}
this.subTasks[var1].setData(var2);
}
@Override
class="kw">public void compute() {
this.setPendingCount(this.size - 1);
for (int var1 = 0; var1 < this.size - 1; var1++) {
this.subTasks[var1].fork();
}
this.subTasks[this.size - 1].compute();
}
class="kw">static class SubTask<D class="kw">extends IntConsumer> class="kw">extends CountedCompleter<Void> {
class="kw">private int from;
class="kw">private int to;
class="kw">private D data;
SubTask(ParallelRangeTask var1, D var2) {
super(var1);
this.data = var2;
}
void init(int var1, int var2) {
this.reinitialize();
this.from = var1;
this.to = var2;
}
D getData() {
class="kw">return this.data;
}
void setData(D var1) {
this.data = var1;
}
@Override
class="kw">public void compute() {
for (int var1 = this.from; var1 < this.to; var1++) {
this.data.accept(var1);
}
this.propagateCompletion();
}
}
}