Java:扩展Thread而不实现run()

时间:2013-06-06 20:47:31

标签: java multithreading

我是一名技术作家,他知道一些Java,我的任务是跟踪一些旧的,高度线程化的Java代码中的线程。代码的原始作者不在这里,所以我们试图弄清楚它是如何工作的。我遇到了一个扩展Thread但没有实现run()方法的类。扩展Thread但不实施run()(如果有的话)有什么意义?

我注意到这个类的其中一个方法是synchronized

public synchronized void incrementCounter() {
  this.counter++;
}

但所有其他方法似乎都是非同步的。事实上,大多数其他方法只是getter和setter。是否需要延长Thread或实施Runnable才能声明方法synchronized?谢谢!

3 个答案:

答案 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类无关:丑陋但可能......