私は、CompletableFutureの実行時間をチェックするメソッドを持っています。そのようなCompletableFutureが2秒以上実行されている場合、私はこのタスクを終了したい。しかし、私は、CompletableFutureメソッドが実行されている制御スレッドを持っていないとどうすればいいですか? responseFutureは、メソッドをやっているところCompletableFuture関連スレッドを削除するにはどうすればいいですか?
final CompletableFuture<List<List<Student>>> responseFuture = new CompletableFuture<>();
responseFuture.supplyAsync(this::createAllRandomGroups)
.thenAccept(this::printGroups)
.exceptionally(throwable -> {
throwable.printStackTrace();
return null;
});
createAllRandomGroups()
private List<List<Student>> createAllRandomGroups() {
System.out.println("XD");
List<Student> allStudents = ClassGroupUtils.getActiveUsers();
Controller controller = Controller.getInstance();
List<List<Student>> groups = new ArrayList<>();
int groupSize = Integer.valueOf(controller.getGroupSizeComboBox().getSelectionModel().getSelectedItem());
int numberOfGroupsToGenerate = allStudents.size()/groupSize;
int studentWithoutGroup = allStudents.size() % groupSize;
if (studentWithoutGroup != 0) groups.add(this.getListOfStudentsWithoutGroup(allStudents, groupSize));
for(int i = 0; i < numberOfGroupsToGenerate; i++) {
boolean isGroupCreated = false;
while (!isGroupCreated){
Collections.shuffle(allStudents);
List<Student> newGroup = this.createNewRandomGroupOfStudents(allStudents, groupSize);
groups.add(newGroup);
if (!DataManager.isNewGroupDuplicated(newGroup.toString())) {
isGroupCreated = true;
allStudents.removeAll(newGroup);
}
}
}
DataManager.saveGroupsToCache(groups);
return groups;
}
printGroups()
private void printGroups(List<List<Student>> lists) {
System.out.println(lists);
}
この文responseFuture.cancel(true);
は、スレッドを殺すことはありません。では、CompletableFutureスレッドを終了させる最もエレガントな方法は何ですか?
あなたは、殺すためのスレッドがあると仮定しています。しかし、これは非同期操作の連鎖のように見えますが、スレッドがまったく待機していない可能性があります。スレッドを強制終了したくない場合は、非同期操作をキャンセルする必要があります。 –
@ DanielPrydenだから、どうすればこれらの操作を殺すことができますか? – masterofdisaster
どの操作が時間を費やしているかによって異なります。'createAllRandomGroups'と' printGroups'のコードを表示できますか? –