Вызываемый пример ведет себя по-разному в режиме отладки в java concurrency

#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()) на a while , и вы увидите результат. Когда if достигается в обычном режиме выполнения, будущее еще не завершено, поэтому выполнение переходит к после if блока и завершает main. Но у вас есть несколько потоков, работающих в фоновом режиме (исполнитель), которые препятствуют завершению работы вашей программы.