Java ExecutorService单线程执行器中的invokeAny方法是否保证返回成功完成的第一个任务的结果

Java ExecutorService单线程执行器中的invokeAny方法是否保证返回成功完成的第一个任务的结果,java,multithreading,executorservice,invoke,callable,Java,Multithreading,Executorservice,Invoke,Callable,我目前正在准备Oracle Java专业认证考试,从名为invokeAny()的ExecutorService接口理解此方法时遇到一些困难。困扰我的不是这个方法的基本功能。我知道此方法旨在返回结果 作为参数传递给此方法的可调用任务列表中的一个可调用任务 并取消其他任务。让我感到困惑的是,官方Java文档说明了 以下: “如果在执行此操作时修改了给定集合,则此方法的结果是未定义的” 我的OCP指南指出: 虽然第一个要完成的任务经常被返回,但这种行为不能保证,因为任何已完成的任务都可以通过此方法返回

我目前正在准备Oracle Java专业认证考试,从名为invokeAny()的ExecutorService接口理解此方法时遇到一些困难。困扰我的不是这个方法的基本功能。我知道此方法旨在返回结果 作为参数传递给此方法的可调用任务列表中的一个可调用任务 并取消其他任务。让我感到困惑的是,官方Java文档说明了 以下:

“如果在执行此操作时修改了给定集合,则此方法的结果是未定义的”

我的OCP指南指出:

虽然第一个要完成的任务经常被返回,但这种行为不能保证,因为任何已完成的任务都可以通过此方法返回

但是如果任务集合在执行过程中没有被修改呢。我已经使用单线程执行器和固定线程池执行器对该方法进行了测试,固定线程池执行器具有一些任意数量的线程(16),如果单线程执行器保证任务始终按顺序执行,invokeAny始终返回成功完成的第一个任务的结果

我的主要问题是:

例如,如果我在考试中遇到一个问题,猜测以下代码的结果:

ExecutorService executorService = Executors.newSingleThreadExecutor();
List<Callable<String>> callables = new ArrayList<>();
callables.add(() -> "Task1");
callables.add(() -> "Task2");
callables.add(() -> "Task3");

String result = null;
try {
   result = executorService.invokeAny(callables);
} catch (InterruptedException e) {
     e.printStackTrace();
} catch (ExecutionException e) {
     e.printStackTrace();
}
System.out.println(result);
executorService.shutdown();
ExecutorService ExecutorService=Executors.newSingleThreadExecutor();
List callables=new ArrayList();
callables.add(()->“Task1”);
callables.add(()->“Task2”);
callables.add(()->“Task3”);
字符串结果=null;
试一试{
结果=executorService.invokeAny(可调用项);
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
系统输出打印项次(结果);
executorService.shutdown();
问题是:

以下代码的结果是什么:

ExecutorService executorService = Executors.newSingleThreadExecutor();
List<Callable<String>> callables = new ArrayList<>();
callables.add(() -> "Task1");
callables.add(() -> "Task2");
callables.add(() -> "Task3");

String result = null;
try {
   result = executorService.invokeAny(callables);
} catch (InterruptedException e) {
     e.printStackTrace();
} catch (ExecutionException e) {
     e.printStackTrace();
}
System.out.println(result);
executorService.shutdown();
A.任务1 B.任务2 C.任务3 结果未定

当我执行这段代码时,我总是得到Task1字符串作为结果,因为一个单线程执行器从第一个任务开始在一个单独的线程上顺序执行任务,而其他任务等待,如果使用固定线程池,则任务以不确定的方式完成

那么,当我使用单线程执行器:a或D时,我的考试答案应该是什么