Можем ли мы получить объект Callable из объекта Future в Java?

У меня есть список вызываемых объектов, который я использую для создания списка будущих объектов. Я использую ExecutorService для одновременного выполнения задач Callable и сохраняю результат в виде списка объектов Future. Теперь я хочу знать, есть ли способ получить исходный вызываемый объект, который использовался для создания данного будущего объекта.


person enigma    schedule 19.06.2018    source источник
comment
Я немного затрудняюсь понять вопрос. Итак, вы хотели бы знать объект Callable, который вы использовали для вызова службы-исполнителя? Это T в Callable‹T› или вызываемый объект в List‹Callable‹T›.?   -  person vijayakumarpsg587    schedule 31.12.2018


Ответы (2)


Если вы получите свои Future, вызвав ExecutorService.invokeAll(), вы можете полагаться на порядок, как описано в javadoc.

 * @return a list of Futures representing the tasks, in the same
 *         sequential order as produced by the iterator for the
 *         given task list, each of which has completed
person Frank Neblung    schedule 19.06.2018
comment
Итак, я создаю два отдельных вызываемых объекта и добавляю их в callableList. После этого я вызвал executorService.invokeall(cllableList), который возвращает список будущих объектов. Но я получаю вывод callbles случайным образом, хотя первый объект будущего должен был вернуть вывод первого вызываемого объекта. Не могли бы вы объяснить. - person Lazycoder_007; 09.10.2019

Реализация по умолчанию не предоставляет вам эту функциональность, хотя вы можете создать свою собственную callable

   import org.apache.commons.math3.util.Pair;

    class MyCallable implements Callable<Pair<Callable,MyObject>>{

        private MyService service;
        public String name;
        public MyCallable(MyService srevice,String name){
            this.srevice = srevice;
            this.name = name;

        }

        @Override
        public Pair<Callable,MyObject> call() throws Exception {
            return new Pair(this,service.doSomeStuff())
        }
    }

Теперь, когда вы вызываете вызываемый объект в будущем, у вас будет доступ к вызываемому объекту. Что-то вроде future.get().getFirst().name будет работать.

person Reza    schedule 17.04.2019