Java スレッドのrun()メソッドは、スレッドの開始時に、そのスレッドで JVM によって呼び出されます。スレッドに何かをさせるには、Thread のサブクラスを作成してその run() メソッドをオーバーライドするか、(推奨) スレッドのコンストラクターに Runnable を提供します。それはいいです。
Thread のサブクラスを作成して run をオーバーライドしている最中に、Thread.run() が public であるため、期待どおりにメソッドを保護できないことに気付きました。次に、その理由に気付きました。Thread は Runnable を実装しているため、公開する必要があります。しかし、なぜ Runnable を実装するのでしょうか?
論理的ではないようです。スレッドは(現在のスレッドから)開始可能ですが、(現在のスレッドから) Runnable を run() するのと同じ方法では実行しません。スレッド自体が(独自のスレッドで) 実行されます。Thread の run メソッドを手動で呼び出す場合は、それを Thread として使用するのではなく、重い Runnable として使用します。
設計上、Thread オブジェクトにアクセスできるコードはすべて、その public run メソッドを呼び出すことができ、公開することを意図していないコードや、そのように呼び出されるように設計されていないコードに突っ込む可能性があります。また、次のような非常に特殊なことも可能です。
Thread.currentThread.run();
私が見ていない Runnable を実装する Thread の正当な使用法はありますか?