2013-06-05 3 views
0

Нужно ли мне иногда называть future.get для проверки выполнения задачи или нет?Как найти, когда поток завершен?

ExecutorService executor = Executors.newSingleThreadExecutor(); 

@SuppressWarnings("unchecked") 
public void start(final file avo) throws IOException 
{ 
    Future future = executor.submit(new Callable(){ 

    @Override 
    public Object call() throws Exception { 
     Condee conv = new Condee(); 
     return conv.doChange(file); 
    }); 

    LOG.debug("Finished the execution serverion"); 
    executor.shutdown(); 


} 
+0

Вы должны быть немного более точными в своем вопросе. Такой неоднозначный вопрос, вероятно, будет закрыт или удален. – gparyani

ответ

1

Добавить вызов к этому перед исполнением.shutdown();

future.get(); 

Этот метод вернется только после его завершения.

+0

Я прокомментировал joaonlima, поскольку операция не выполняется асинхронно, если мы это сделаем. – user1595858

+0

Можете ли вы уточнить? Когда вы вызываете future.get, поток, который вызывает future.get, блокируется, но поток, который будет запущен в будущем, будет выполняться. Какое поведение вы ищете? Кого вы хотите знать, когда поток выполняется в исходном вопросе? –

+0

Я вызываю метод start из основного потока. Когда я использую future.get, основной поток также блокируется. Я хочу, чтобы метод запуска работал асинхронно. Этот созданный поток никому не должен уведомлять, он должен выполнить метод, когда это будет сделано. – user1595858

2

Чтобы проверить завершение, вы можете использовать future.isDone(), это необходимо постоянно проверять.

Но если вы используете future.get(), этот метод будет подождать до конца и затем вернуть результат.

+0

Я заметил, что при использовании future.get() блокирует основной поток, который запускает метод start и не выполняет операцию асинхронно. Я хочу выполнить метод старта асинхронно, что вы предлагаете? – user1595858

+0

Операция выполняется асинхронно, но основной поток ждет своего завершения, чтобы получить значение, когда вы вызываете get(). Если у вас есть что-то еще в основном потоке (без этого возвращаемого значения), вы можете просто сделать это и вызвать get() после. – joaonlima

0

Попытайтесь получить значение, используя метод get. Вы либо получите результат, либо будет выбрано исключение. Вот четыре варианта, когда вы вызываете получить на будущее:

  1. Вы получаете значение результата
  2. Вы получаете CancellationException - если вычисление было отменено (например Future.cancel (истина) называется)
  3. Вы получаете ExecutionException - если вычисление сгенерировала исключение
  4. Вы получаете InterruptedException - если текущий поток был прерван во время ожидания (например, executor.shutdownNow() называется)