当线程启动时,JVM 在该线程上调用Java 线程的run()方法。要让线程有事可做,您可以创建 Thread 的子类并覆盖其 run() 方法,或者(首选)您可以为线程的构造函数提供 Runnable。没关系。
我正在创建 Thread 的子类并覆盖运行,但我意识到我无法像预期的那样使方法受到保护,因为 Thread.run() 是公共的。然后我意识到为什么:它必须是公开的,因为 Thread 实现了 Runnable。但是它为什么要实现 Runnable 呢?
这似乎不合逻辑。一个线程是可启动的(从当前线程),但你不能以与 run() 一个 Runnable (从当前线程)相同的方式运行它;线程自己运行(在自己的线程上)。如果您确实手动调用了 Thread 的 run 方法,那么您并没有将其用作 Thread,而只是一个重量级的 Runnable。
由于这种设计,任何可以访问 Thread 对象的代码都可以调用其公共 run 方法,并可能会插入不打算公开或设计为以这种方式调用的代码。它还允许像这样非常奇特的事情:
Thread.currentThread.run();
我没有看到的实现 Runnable 的 Thread 是否有合法用途?