Пытаясь ускорить это для цикла, но я не могу использовать реализацию Callable - PullRequest
0 голосов
/ 10 сентября 2018

Это последовательный цикл:

  private boolean canSpawnVehicle(SpawnPoint spawnPoint) {
// TODO: can be made much faster.
Rectangle2D noVehicleZone = spawnPoint.getNoVehicleZone();
for(VehicleSimView vehicle : vinToVehicles.values()) {
  if (vehicle.getShape().intersects(noVehicleZone)) {
    return false;
  }
}
return true;

}

Это моя попытка использовать сервис executor и вызываемый класс реализации:

  private boolean canSpawnVehicle(SpawnPoint spawnPoint) throws ExecutionException, InterruptedException {
  // TODO: can be made much faster.
  Rectangle2D noVehicleZone = spawnPoint.getNoVehicleZone();
  ExecutorService executor = Executors.newFixedThreadPool(6);
  Future<Boolean> future;
  for (VehicleSimView vehicle : vinToVehicles.values()) {
      future = executor.submit(new CanSpawnThread(vehicle, noVehicleZone));
      if(!future.get()){
          return false;
      }
  }
  executor.shutdown();
  return true;

}

Это класс потока:

открытый класс CanSpawnThread реализует Callable {

private VehicleSimView vehicle;
private Rectangle2D noVehicleZone;

public CanSpawnThread(VehicleSimView vehicle, Rectangle2D noVehicleZone){
    this.vehicle = vehicle;
    this.noVehicleZone = noVehicleZone;
}

public Boolean call() {
    boolean can = true;
    if (vehicle.getShape().intersects(noVehicleZone)){
        can = false;
    }
        return can;
}

}

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вы отправляете задание и ждете его завершения. Таким образом, все происходит последовательно, поэтому вы не можете улучшить свою производительность. Отправьте все задания, а затем дождитесь окончания и проверьте результат. как это:

 private boolean canSpawnVehicle(SpawnPoint spawnPoint) throws ExecutionException, InterruptedException {
  // TODO: can be made much faster.
  Rectangle2D noVehicleZone = spawnPoint.getNoVehicleZone();
  ExecutorService executor = Executors.newFixedThreadPool(6);
  List<Future<Boolean>> futures = new ArrayList();
  for (VehicleSimView vehicle : vinToVehicles.values()) {
      futures.add(executor.submit(new CanSpawnThread(vehicle, noVehicleZone)));          
  }
  for(Future<Boolean> future : futures) {
       if(!future.get()) {
          return false;
       }
  }
  executor.shutdown();
  return true;
}
0 голосов
/ 10 сентября 2018

Вы можете попытаться использовать ParallelsStream, предполагая, что в списке достаточно элементов для выравнивания потоков. Я не проверял это все же.

private boolean canSpawnVehicle(SpawnPoint spawnPoint) {
    Rectangle2D noVehicleZone = spawnPoint.getNoVehicleZone();
    Optional result = vinToVehicles.values().parallelStream().filter(v -> !v.getShape().intersects(noVehicleZone)).findFirst();

    return !result.isPresent();
}
0 голосов
/ 10 сентября 2018

Посмотрите на цикл:

for (VehicleSimView vehicle : vinToVehicles.values()) {
      future = executor.submit(new CanSpawnThread(vehicle, noVehicleZone));
      if(!future.get()){
          return false;
      }
  }

Вы отправляете исполнителю, а затем ждете завершения будущего, прежде чем продолжить и отправлять следующий.Это все еще просто последовательный цикл.

Отправьте все ваши вызовы исполнителю, сохраните Future s в списке, а затем проверьте элементы списка, чтобы увидеть, завершены ли они.

Или, лучше, используйте CompletionService, который вернет вам фьючерсы в порядке их завершения.Как только вы найдете Future, который возвращает false, отмените все остальные и вернитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...