Метод Java Thread run() вызывается JVM в этом потоке, когда начинается поток. Чтобы дать потоку что-то сделать, вы можете сделать подкласс Thread и переопределить его метод run() или (предпочтительно), вы можете предоставить Runnable в конструктор потока. Это прекрасно.
Я был посреди создания подкласса Thread и overriding run, и я понял, что не могу сделать метод защищенным, как я ожидал, потому что Thread.run() является общедоступным. Тогда я понял, почему: он должен быть общедоступным, потому что Thread реализует Runnable. Но почему он реализует Runnable?
Это не кажется логичным. Поток запускается (из текущего потока), но вы не запускаете его так же, как вы запускаете() Runnable (из текущего потока); поток запускается сам (по собственному потоку). Если вы вызываете метод запуска Thread вручную, то вы не используете его как Thread, просто тяжелый Runnable.
Из-за конструкции любой код с доступом к объекту Thread может вызывать его метод публичного запуска и потенциально вызывать код, который не предназначен для публичного или предназначенного для вызова таким образом. Это также позволяет очень странно такие вещи:
Thread.currentThread.run();
Существует ли законное использование для реализации Thread Runable, которое я не вижу?