ParallelTask class

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

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

extends: CountedCompleter<Void>

Поля (1)

МодификаторыТипИмя
final Supplier<D> supplier

Методы (15)

МодификаторыВозвратСигнатура
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Parallel task has already been started")
public ParallelRangeTask<D> appendTaskParallelRangeTask<D> appendTask()
public void doInvokevoid doInvoke()
for for(int var1 = this.size; var1 < this.subTasks.length; var1++)
for for(int var1 = 0; var1 < this.size - 1; var1++)
for for(int var1 = 0; var1 < this.size; var1++)
for for(int var2 = 0; var2 < this.size; var2++)
public ParallelRangeTask<D> getParallelRangeTask<D> get(int var1)
if if(this.running)
if if(this.running)
if if(this.subTasks.length <= this.size)
public void initvoid init()
public int sizeint size()
abstract super super(var1)
abstract this this(null, var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.component.task;

class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import java.util.Arrays;
class="kw">import java.util.concurrent.CountedCompleter;
class="kw">import java.util.function.IntConsumer;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;

class="kw">public class ParallelTask<D class="kw">extends IntConsumer> class="kw">extends CountedCompleter<Void> {
   class="kw">private class="kw">final Supplier<D> supplier;
   @Nonnull
   class="kw">private ParallelRangeTask<D>[] subTasks = new ParallelRangeTask[0];
   class="kw">private int size;
   class="kw">private class="kw">volatile boolean running;

   class="kw">public ParallelTask(Supplier<D> var1) {
      this(null, var1);
   }

   class="kw">public ParallelTask(CountedCompleter<?> var1, Supplier<D> var2) {
      super(var1);
      this.supplier = var2;
   }

   @Override
   class="kw">public void reinitialize() {
      if (this.running) {
         throw new IllegalStateException("Parallel task has already been started");
      }

      super.reinitialize();
   }

   class="kw">public void init() {
      this.reinitialize();
      this.size = 0;
   }

   class="kw">public ParallelRangeTask<D> appendTask() {
      if (this.running) {
         throw new IllegalStateException("Parallel task has already been started");
      }

      if (this.subTasks.length <= this.size) {
         this.subTasks = Arrays.copyOf(this.subTasks, ArrayUtil.grow(this.size));

         for (int var1 = this.size; var1 < this.subTasks.length; var1++) {
            this.subTasks[var1] = new ParallelRangeTask<>(this, this.supplier);
         }
      }

      class="kw">return this.subTasks[this.size++];
   }

   class="kw">public int size() {
      class="kw">return this.size;
   }

   class="kw">public ParallelRangeTask<D> get(int var1) {
      class="kw">return this.subTasks[var1];
   }

   @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">public void doInvoke() {
      this.running = true;

      for (int var1 = 0; var1 < this.size; var1++) {
         this.subTasks[var1].running = true;
      }

      this.invoke();

      for (int var2 = 0; var2 < this.size; var2++) {
         this.subTasks[var2].running = false;
      }

      this.running = false;
   }
}