Pergunta

eu tenho alguns Task executar uma operação de bloqueio de E/S que pode travar (buscando um arquivo de um URL)

task = new Task<List<WSDLOperation>>() {
            @Override
            protected List<WSDLOperation> call() {
                List<WSDLOperation> services = new ArrayList<>();
                try {
                    services = WSDLService.createService(wsdlURL).getOperations();
                } catch (Exception ex) {
                    LOG.log(Level.WARNING, "Can't reach {0}", wsdlURL);
                }
                return services;
            }
        };

    }

O método createService posso esperar para sempre sem jogar nenhum Exception.(Eu executo a tarefa usando um global (static public)ExecutorService definido na classe principal).

Foi útil?

Solução

Como usar o futuro e cancelar a tarefa após o tempo limite:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Task t = new Task();
        Future<String> future = executor.submit(t);

        try {
            System.out.println("Started..");
            System.out.println(future.get(5, TimeUnit.SECONDS)); // throws
                                                                    // TimeoutException
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        for (int i = 0; i < 1000; i++) {
            Thread.sleep(1000);
            System.out.println("task running!");
        }
        return "Ready!";
    }
}

Outras dicas

Você está usando ExecutorService, então você pode fazer isso depois de enviar a tarefa:

ExecutorService executor = // ...  
Future<?> future = executor.submit(task);
future.get(5, TimeUnit.MINUTES); // timeout 5 mins
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top