ThreadPoolExecutor: ожидание завершения вне метода

Текущий сценарий: мой код (скажем, «Вызывающий класс: caller()») будет вызывать метод класса (класс ThreadPoolClass: writeData()), который внутренне выполняет свою задачу через ThreadPoolExecutor. Теперь эта реализация не ждет завершения всех своих задач.

Проблема: хотя мой код (вызывающий метод()) должен дождаться завершения всех задач из этого (метод writeData() )ThreadPoolExecutor. В настоящее время контроллер возвращается к методу caller() после отправки задач.

Реализация ThreadPoolClass не может быть изменена, поэтому я хотел выяснить, как я могу этого добиться.

//Образец кода

class Caller {
    public static void main(String[] args) {
        ThreadPoolClass t = new ThreadPoolClass();
        t.writeData();

        // I want to wait here until the execution is complete
    }
}

class ThreadPoolClass{
    void writeData() {
        Runnable thread = new Runnable() {

            @Override
            public void run() {
                //  Do some database commit operations

            }
        };
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
        fixedThreadPool.submit(thread);
        fixedThreadPool.shutdown();
    }
}

Любой хедз-ап будет полезен, независимо от того, возможен он или нет.

Обратите внимание**, что это всего лишь пример, мой исходный код имеет цепочку вызовов методов класса, которая в конечном итоге выполняет метод с помощью ThreadPoolExecutor.

Спасибо Блюдо


person Dish    schedule 07.08.2015    source источник
comment
Было бы проще, если бы мы могли увидеть реальный код. По сути, вы можете использовать Futures, Executor.awaitTermination(), чтобы назвать два. Однако не могу сказать, возможно ли это без изменения кода ThreadPoolClass, не видя его.   -  person Fildor    schedule 07.08.2015
comment
Я добавил пример кода. Пожалуйста, проверьте то же самое.   -  person Dish    schedule 07.08.2015
comment
если вы хотите дождаться завершения выполнения и больше ничего не делать, нужно ли использовать потоки?   -  person Zavael    schedule 07.08.2015
comment
Я не вижу возможности без изменения кода ThreadPoolClass, кроме как написать новый класс, делающий то же самое, но с возможностью ожидания/блокировки или обратного вызова.   -  person Fildor    schedule 07.08.2015
comment
Привет @Zavael, это какой-то уже существующий API, который я пытаюсь повторно использовать в своем приложении.   -  person Dish    schedule 07.08.2015
comment
Можно ли просто скопировать некоторые операции фиксации базы данных и выполнить их последовательно в основном потоке? Повторное использование кода — это здорово, но этот API делает его невозможным.   -  person Fildor    schedule 07.08.2015
comment
Спасибо всем за участие. Итак, основываясь на приведенных выше комментариях и некотором анализе с моей стороны, я предполагаю, что этого нельзя достичь.   -  person Dish    schedule 10.08.2015


Ответы (1)


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

Я не вижу возможности без изменения кода ThreadPoolClass, кроме как написать новый класс, делающий то же самое, но с возможностью ожидания/блокировки или обратного вызова. – Филдор

Можно ли просто скопировать "Выполнить некоторые операции фиксации базы данных" и выполнить их последовательно в основном потоке? Повторное использование кода — это здорово, но этот API делает это невозможным.

person Dish    schedule 10.08.2015