(@prash - Also ... by starting to use Java in the Java 1.1 era.)
@StephenC If I read your answer correctly, you're suggesting that Runnable exists (largely) for backward compatibility reasons. But aren't there situations where it's unnecessary or too expensive to implement (or to require) Callable interface (e.g., in ScheduledFuture<?> ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)) ? So isn't there a benefit to maintaining both interfaces in the language even the history didn't force the current outcome?
@max - Well I said that, and I still agree with that. However, that is a secondary reason. But even so, I suspect that Runnable would have been modified if there had not been an imperative to maintain compatibility. The "boilerplate" of return null; is a weak argument. (At least, that would have been my decision ... in the hypothetical context where you could ignore backwards compatibility.)
@prash - the basic facts are to be found in old textbooks. Like the first edition of Java in a Nutshell.
And, obviously, there are use-cases where a task doesn't need to return a result or throw a checked exception. For those use-cases, using Runnable is more concise than using Callable<Void> and returning a dummy (null) value from the call() method.
Because the Runnable interface cannot do everything that Callable does!
Runnable has been around since Java 1.0, but Callable was only introduced in Java 1.5 ... to handle use-cases that Runnable does not support. In theory, the Java team could have changed the signature of the Runnable.run() method, but this would have broken binary compatiblity with pre-1.5 code, requiring recoding when migrating old Java code to newer JVMs. That is a BIG NO-NO. Java strives to be backwards compatible ... and that's been one of Java's biggest selling points for business computing.
What are the differences in the applications of Runnable and Callable. Is the difference only with the return parameter present in Callable?
What is the need of having both if Callable can do all that Runnable does?