3 回答
TA贡献1779条经验 获得超6个赞
您可以尝试使用 parallelStream 假设列表有足够的项目来证明线程的合理性。不过我还没有测试过这个。
private boolean canSpawnVehicle(SpawnPoint spawnPoint) {
Rectangle2D noVehicleZone = spawnPoint.getNoVehicleZone();
Optional result = vinToVehicles.values().parallelStream().filter(v -> !v.getShape().intersects(noVehicleZone)).findFirst();
return !result.isPresent();
}
TA贡献1799条经验 获得超9个赞
您提交任务并等待完成。以这种方式,每件事都是连续的,因此您无法提高性能。提交所有任务,然后等待完成并检查结果。像这样:
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;
}
TA贡献1845条经验 获得超8个赞
看循环:
for (VehicleSimView vehicle : vinToVehicles.values()) {
future = executor.submit(new CanSpawnThread(vehicle, noVehicleZone));
if(!future.get()){
return false;
}
}
您正在提交给执行者,然后等待未来完成,然后继续并提交下一个。这仍然只是一个顺序循环。
将所有可调用对象提交给执行程序,将Futures存储在列表中,然后检查列表的元素以查看它们是否已完成。
或者,更好的是使用 a CompletionService,它会按照它们完成的顺序返回给你。一旦你找到一个返回 false 的 Future,取消所有其他的并返回。
添加回答
举报