0

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

我确实注意到这个类的方法之一是synchronized

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

但所有其他方法似乎都是非同步的。事实上,大多数其他方法只是 getter 和 setter。为了声明一个方法,扩展Thread或实现是必要的吗?谢谢!Runnablesynchronized

4

3 回答 3

3

我的猜测是,这段较旧的代码是在一些标准线程池库、ExecutorService 等之前编写的。所以也许这是该公司实现类似功能的尝试。(或者不是这里发明的响应)只要代码总是这样

Thread thread = new ThisSpecialThreadClass(someRunnable);
thread.start();

您将获得它所具有的任何“好处”,并且正如您在评论中指出的那样,它最终应该调用someRunnable.run().

于 2013-06-06T20:57:51.010 回答
1

扩展 Thread 但不实现 run() 有什么意义

正如@Mik378 所提到的,这样做几乎没有意义。在不覆盖该run()方法的情况下,线程将立即开始和结束。

为了声明同步的方法,是否需要扩展 Thread 或实现 Runnable?

不,他们彼此没有任何关系。您无需创建任何线程即可使用synchronized方法。对象是synchronized方法的实例,无论哪个线程调用它(即使它是“主”线程)都将在该对象上同步。

于 2013-06-06T20:59:14.903 回答
0

如果您查看一个扩展的类Thread(尽管不推荐)并且不实现该run方法,那么听起来就像是一个abstract类。检查一下。

此外,你的第二个问题的答案肯定是No

synchronised从不期望包装类扩展Thread或实现Runnable,因为线程与特定类无关,而是跨越一个或多个类。

如果您断言相关类不是abstract,我怀疑Thread您看到的类型确实是属于另一个包的自定义类型(不同于java.lang.Thread)......并且与 Thread 类无关:丑陋但可能......

于 2013-06-06T20:52:40.847 回答