我是一名技术作家,他知道一些Java,我的任务是跟踪一些旧的,高度线程化的Java代码中的线程。代码的原始作者不在这里,所以我们试图弄清楚它是如何工作的。我遇到了一个扩展Thread
但没有实现run()
方法的类。扩展Thread
但不实施run()
(如果有的话)有什么意义?
我注意到这个类的其中一个方法是synchronized
:
public synchronized void incrementCounter() {
this.counter++;
}
但所有其他方法似乎都是非同步的。事实上,大多数其他方法只是getter和setter。是否需要延长Thread
或实施Runnable
才能声明方法synchronized
?谢谢!
答案 0 :(得分:3)
我的猜测是这个旧代码是在一些标准线程池库,ExecutorService等之前编写的。所以也许是公司试图实现类似的功能。 (或者这里没有发明的响应)只要代码总是
Thread thread = new ThisSpecialThreadClass(someRunnable);
thread.start();
你会得到它带来的任何“好处”,而且,正如你在评论中指出的那样,它应该最终调用someRunnable.run().
答案 1 :(得分:1)
扩展Thread但不实现run()
的意义何在
正如@ Mik378所提到的,这样做几乎没有任何意义。如果不重写run()
方法,线程将立即开始和结束。
是否需要扩展Thread或实现Runnable以声明方法同步?
不,他们彼此无关。您无需创建任何线程即可使用synchronized
方法。 synchronized
的对象是方法的实例,无论哪个线程调用它(即使它是“主”线程)都将在该对象上同步。
答案 2 :(得分:0)
如果你看一个扩展Thread
的类(虽然不推荐)并且没有实现run
方法,听起来像是abstract
类。检查一下。
此外,第二个问题的答案肯定是否:
synchronised
从不期望包装类扩展Thread
或实现Runnable
,因为线程没有与特定类相关联,而是跨越一个或多个。
如果断言相关的类不是abstract
,我怀疑你看到的Thread
类型确实属于另一个包的自定义类型(不同于java.lang.Thread
)。并且与Thread类无关:丑陋但可能......