#java #concurrency #callable
#java #параллелизм #вызываемый
Вопрос:
Я тестирую java.util.concurrent.Вызываемый и реализованный call() в классе ниже, но при использовании isDone() класса Future он не вычисляет значение true и никогда не печатает строку в инструкции print, но при отладке того же самого он оценивал значение true и печатает. Почему он ведет себя по-другому. Заранее спасибо.
public class CallExample implements Callable<String>{
public String call(){
return "h";
}
public static void main(String k[])throws InterruptedException,ExecutionException{
CallExample call=new CallExample();
Thread one=new Thread();
ExecutorService service=Executors.newFixedThreadPool(2);
Future<String> fut=service.submit(call);
if(fut.isDone()){
System.out.println("Im here"); // Prints only in debug mode
System.out.println(fut.get());
}
}
Комментарии:
1. Потому что в режиме отладки вызываемый объект успел запуститься…
2. Что вы пытаетесь сделать? Вы просто пытаетесь дождаться
Future
завершения?3. @AndyTurner- Да, завершаю задачу и печатаю ее из метода isDone()
4. @assylias- правильно, режим отладки был всего на 5-10 секунд (который его напечатал), но я оставил выполнение как есть на 45 секунд при обычном выполнении (в пуле не вызывается завершение работы), чтобы посмотреть, будет ли это напечатано, но это не так. В этом суть.
5. @Raken измените
if (fut.isDone())
на awhile
, и вы увидите результат. Когдаif
достигается в обычном режиме выполнения, будущее еще не завершено, поэтому выполнение переходит к послеif
блока и завершает main. Но у вас есть несколько потоков, работающих в фоновом режиме (исполнитель), которые препятствуют завершению работы вашей программы.