ParallelRangeTask class

Пакет: com.hypixel.hytale.component.task

Файл: com/hypixel/hytale/component/task/ParallelRangeTask.java

extends: CountedCompleter<Void>

Поля (7)

МодификаторыТипИмя
final int PARALLELISM
private D data
private int from
private int to
var1
int var3
int var4

Методы (19)

МодификаторыВозвратСигнатура
abstract throw new IllegalStateExceptionthrow new IllegalStateException("ParallelRangeTask has already been started")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Failed to distribute the whole range to tasks!")
SubTask SubTask(ParallelRangeTask var1, D var2)
public void computepublic void compute()
for for(int var3 = 0; var3 < this.subTasks.length; var3++)
for for(this.size = 0; this.size < this.subTasks.length && var1 < var2; this.size++)
for for(int var1 = 0; var1 < this.size - 1; var1++)
for for(int var1 = this.from; var1 < this.to; var1++)
public D getD get(int var1)
D getDataD getData()
if if(this.running)
if if(var1 < var2)
if if(this.running)
void initvoid init(int var1, int var2)
public void setvoid set(int var1, D var2)
void setDatavoid setData(D var1)
public int sizeint size()
abstract super super(var1)
abstract this this(null, 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();
      }
   }
}