The Callable
and Supplier
functional interfaces in java.util.concurrent
and java.util.function
packages respectively have the
Apart from the obvious, Callable throwing an exception, the difference is semantic. They have different names because they represent different things. The purpose is to make code easier to understand. When you use a Callable, your interface choice implies that the object is going to be executed by another thread. When you use Supplier you imply that it's just an object that supplies data to another component.
For Runnable
and Callable
, they've been parts of the concurrent package since Java 6. It implies that both of them are ready to be submitted to an Executor
and run asynchronously. Here Callable
has a specific usage.
While for Runnable
(0 in 0 out), Supplier
(0 in 1 out), Consumer
(1 in 0 out) and Function
(1 in 1 out), they've been parts of the functional feature since Java 8. All of them are ready to be handled by something lambda friendly, like CompletableFuture
. Here Supplier
just means a function without any input param but has a return value, which is highly abstract.
Their difference in usage can be seen from their respective documentation:
Callable:
A task that returns a result and may throw an exception. Implementors define a single method with no arguments called call.
The Callable interface is similar to Runnable, in that both are designed for classes whose instances are potentially executed by another thread.
Supplier:
Represents a supplier of results.
There is no requirement that a new or distinct result be returned each time the supplier is invoked.
This means that the caller of Callable.call
expects an exception to be thrown and will handle the exception accordingly. This is useful for tasks like reading and writing to files, where many kinds of IOException
s can be thrown. Callable
is also designed to be run on another thread.
Supplier
on the other hand, is very general. It just "supplies a value" and that's it.
So Callable
is more specialised than Supplier
. If you are not dealing with another thread or your task is very unlikely to throw an exception, Supplier
is recommended.