Why is this an issue?

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.

Noncompliant code example

public static void main(String[] args) {
	Thread runnable = new Thread() {
		@Override
		public void run() { /* ... */ }
	};
	new Thread(runnable).start();  // Noncompliant
}

Compliant solution

public static void main(String[] args) {
	Runnable runnable = new Runnable() {
		@Override
		public void run() { /* ... */ }
	};
	new Thread(runnable).start();
}