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();
      }
   }
}