It has already been clarified that there are two ways to define the logic to be executed when working with Thread.
Your question's title though contains more. Why does Thread implements Runnable (please let me continueamend that) if starting it always requires calling start() instead of Runnable's run()?
Technically it is indeed not required. The designers of that class could have decided to call the method of Thread you might override work instead of run and then start would call the injected Runnable#run() or Thread#work().
The common pattern of creating a Thread (either way) and calling start() on it would still work.
Now perhaps there are other reasons:
- Consistency: don't invent new names for the same concept (still doesn't require to actually implement
Runnable) - Reusability in other contexts: maybe they had in mind you would pass around a (not yet started)
Threadobject and let it execute by someone else. In case the strategy were to run the logic immediately instead of concurrently, that someone would need a method to call the actual synchronously runnable piece of code hidden inside theThread(remember there are two ways to define it). To unify that,Runnableis appropriate (but offering an intermediate methodpublic Runnable asSyncRunnable()would have worked too).