当线程启动时,JVM会在该线程上调用Java Thread的run()方法.要给线程做一些事情,你可以创建一个Thread的子类并覆盖它的run()方法,或者(首选)你可以为线程的构造函数提供一个Runnable.没关系.
我正在制作一个Thread的子类并重写run,我意识到我无法使该方法受到保护,因为Thread.run()是公共的.然后我意识到了原因:它必须是公共的,因为Thread实现了Runnable.但为什么它实现了Runnable?
这似乎不符合逻辑.一个线程是可启动的(来自当前线程),但是你没有像运行()一个Runnable(来自当前线程)那样运行它; 线程自己运行(在自己的线程上).如果你手动调用Thread的run方法,那么你不是将它用作Thread,只是一个重量级的Runnable.
由于这种设计,任何可以访问Thread对象的代码都可以调用它的公共运行方法,并可能潜入代码,这些代码不是公开的,或者设计为以这种方式调用.它还允许这样的非常奇怪的事情:
Thread.currentThread.run();
Run Code Online (Sandbox Code Playgroud)
Thread实现Runnable是否有合法用途,我没有看到?
Ste*_*n C 24
原因是"向后兼容".
在Thread类起源于Java 1.0中......或更早版本.在那些日子里,Java没有内部类,因此没有一种轻量级的方法来实现Runnable实例.如果您查看那个时代的旧线程示例和教程,通常会看到扩展Thread和覆盖该run()方法的类.
随着时间的推移,人们意识到扩展Thread不是一个好主意(出于各种原因).但是,Thread设计无法更改,因为这会使旧Java代码与较新的JVM不兼容.
Thread实现Runnable是否有合法用途,我没有看到?
这取决于你的"合法"的含义.
早期写的旧代码并不是通过旧方式做事而"非法"的.关于它没有什么"破碎".
有可能的情况如果它确实是有意义的扩展Thread并重写run()方法.例如,您可能希望run()实现一些特殊的机制来将信息传入或传出提供的信息Runnable,或者实现一些特殊的异常处理,或者......使线程"可重启".
甚至可能存在您想要run()直接调用线程对象的情况.例如,如果你被交给一些扩展的"狗早餐"代码,Thread你必须将其转换为在线程池中运行而不修改原始代码.您可以考虑实例化crufty线程类并将实例作为runnables传递给线程池来运行.(是的......太可怕了!)
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |