Em Java, o multithreading permite que tarefas sejam executadas simultaneamente, melhorando o desempenho e a capacidade de resposta. Tradicionalmente, os desenvolvedores usavam a interface Runnable para definir tarefas, mas ela tem duas limitações principais: ela não pode retornar um resultado e não pode lançar exceções verificadas. Para superar isso, o Java introduziu as interfaces Callable e Future no Java 5.
comparação de string java
Interface chamável
O Interface chamável representa uma tarefa que retorna um resultado e pode lançar uma exceção. É semelhante ao Runnable, mas mais flexível, pois pode retornar um valor e lançar exceções verificadas.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
Saída
Result: 15
Explicação: Uma tarefa chamável é enviada ao executor. Ele calcula a soma dos números de 1 a 5 e retorna o resultado. O resultado é recuperado usando future.get() após o término da tarefa.
Interface Futura
O Interface futura representa o resultado de uma computação assíncrona. Quando você envia uma tarefa Callable ou Runnable para um ExecutorService, ele retorna um objeto Future.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
Saída
Result: 30
Explicação: OCallablecomputação de tarefa10 + 2 and ExecutorService.submit()método retorna umFutureobjeto. Usandofuture.get()obtemos o resultado assim que o cálculo for concluído.
Exigível vs Futuro
| Recurso | Chamável | Futuro |
|---|---|---|
| Propósito | Representa uma tarefa que retorna um resultado | Representa o resultado de uma tarefa assíncrona |
| Tipo de retorno | Retorna um resultado quando executado | Contém o resultado retornado por um Callable |
| Definido em | pacote java.util.concurrent | pacote java.util.concurrent |
| Execução | Enviado para ExecutorService | Retornado por ExecutorService.submit() |
| Métodos | Tem uma chamada de método() | Possui métodos como get() isDone() cancel() |
| Tratamento de exceções | Pode lançar exceções verificadas | Lida com resultados e exceções após a execução |
| Uso | Define o que executar | Controla, monitora e recupera o resultado de uma tarefa |