2015-08-07 1 views
0

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

Вопрос: Хотя мой код (метод caller()) должен ждать завершения всех задач из этого (метод 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.

Благодаря Dish

+1

Было бы легче, если бы мы могли видеть фактический код. В принципе, вы можете использовать Futures, Executor.awaitTermination(), чтобы назвать два. Не могу сказать, возможно ли это без изменения кода ThreadPoolClass, не видя его. – Fildor

+0

Я добавил пример кода. Пожалуйста, проверьте то же самое. – Dish

+0

, если вы хотите подождать до завершения выполнения и не будете делать что-либо другое, нужно ли использовать потоки? – Zavael

ответ

0

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

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

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