The difference between the Runnable and Callable interfaces in Java
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.
Introduction
Runnable and Callable both represent units of work that can run concurrently, but they are designed for different needs. Runnable is the older, simpler option for tasks that do not return a result, while Callable is the better fit when the task needs to return a value or throw checked exceptions.
Runnable In One Sentence
A Runnable has one method:
It does not return anything and cannot declare checked exceptions.
This is useful for fire-and-forget work or tasks where the result is communicated in some other way.
Callable In One Sentence
A Callable<V> has one method:
It returns a value of type V and may throw checked exceptions.
This is the usual choice when the caller needs to retrieve a computed result.
The Most Important Differences
The practical differences are:
- '
Runnablereturns nothing,Callablereturns a value' - '
Runnablecannot declare checked exceptions,Callablecan' - '
Runnableis commonly used withThreaddirectly' - '
Callableis typically submitted to anExecutorService'
That last point matters because Callable works naturally with Future, which lets you inspect task completion and retrieve results.
When To Use Each One
Use Runnable when:
- the task performs side effects only
- no result needs to be returned
- you want a simple command object
Use Callable when:
- the task computes a value
- failure needs to propagate as a checked exception
- you want to coordinate with
Futureor executor APIs
If the task’s outcome matters, Callable is usually the better design.
Can A Runnable Still Produce Results
Yes, but only indirectly. A Runnable can mutate shared state, complete a promise-like object, or write into a queue. That works, but it is usually less explicit than a Callable returning a value.
This is valid, but the result is communicated through external state rather than the task interface itself.
Executors Make The Difference Clearer
Modern Java concurrency usually relies on executors rather than raw Thread creation.
Both interfaces can be submitted, but only the Callable task naturally returns a typed result.
Common Pitfalls
The most common mistake is using Runnable for a task that clearly has a meaningful result. That usually forces awkward shared-state patterns later.
Another mistake is forgetting that Future.get() can block. Using Callable gives you a result, but you still need to think about how and when you wait for it.
A third issue is assuming Callable is always superior. If the task truly has no result, Runnable keeps the API simpler and more honest.
Summary
- '
Runnableis for concurrent work with no direct return value.' - '
Callableis for concurrent work that returns a result or throws checked exceptions.' - '
Runnablefits simple side-effect tasks well.' - '
Callablefits executor-based result retrieval throughFuture.' - Choose the interface based on whether the task’s outcome matters to the caller.
Related reading
- The pipe 'async' could not be found
- The right way to limit maximum number of threads running at once?
- The thread has exited with code 0 0x0 with no unhandled exception
- The web application appears to have started a thread named Timer-0 but has failed to stop it
- The JPA hashCode() / equals() dilemma
- The performance impact of using instanceof in Java
- There is a pending asynchronous operation, and only one asynchronous operation can be pending concurrently
- Thread-safe class in Java by means of synchronized blocks

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.