
Метод run() интерфейса Runnable отличается от метода call() интерфейса Callable тем, что он не возвращает никакого значения и не выбрасывает исключения.
Однако, если потребуется, чтобы метод call() тоже не возвращал значение, то в качестве параметризованного параметра можно передать Void.
class Apartment implements Callable<Void> {
boolean booked;
Apartment(boolean booked) {
this.booked = booked;
}
@Override
public Void call() throws Exception {
if (booked) {
throw new Exception("The appatment is booked");
}
System.out.println("The apartment is available for booking");
return null;
}
}
Apartment apartment = new Apartment(false);
ExecutorService ex = Executors.newSingleThreadExecutor();
Future future = ex.submit(apartment);
try {
future.get(); // The apartment is available for booking
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
ex.shutdownNow();
}