The semantics of Thread
and Runnable
are different, and while it is technically correct to use Thread
where
a Runnable
is expected, it is a bad practice to do so.
The crux of the issue is that Thread
is a larger concept than Runnable
. A Runnable
represents a task. A
Thread
represents a task and its execution management (ie: how it should behave when started, stopped, resumed, …). It is both a task
and a lifecycle management.
public static void main(String[] args) { Thread runnable = new Thread() { @Override public void run() { /* ... */ } }; new Thread(runnable).start(); // Noncompliant }
public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { /* ... */ } }; new Thread(runnable).start(); }