Какое отличие метода run из Thread от того же метода из Runnable?
Я вас сейчас скажу страшное: Thread и есть Runnable. Так что разницы никакой.
Runnable- интерфейс задачи с методом run().Thread- исполнитель задачи в новом потоке.
Сам Threadтак же реализует интерфейс Runnableи запускает свою собственную задачу, определенную в его методе run(), в новом потоке, по-умолчанию его задачей является запустить переданную ему другую задачу, например через конструктор new Thread(Runnable).
Самостоятельно метод run() у объекта Thread никогда не вызывается, так как суть объекта Thread, это создать новый поток, а затем jvm сама начнет выполнение задачи вызовом метода run() уже в новом потоке.