首页 > 解决方案 > Thread 类的方法与 Thread.currentThread() 使用的方法之间的区别?

问题描述

我想从方法 currentThread() 的文档开始:

  • 返回对当前正在执行的线程对象的引用。
  • @return 当前正在执行的线程。

现在知道了这一点,例如,像这样调用诸如、、等方法是有道理的。join()isAlive()getName()isInterrupted()Thread.currentThread().join

我的问题是我们如何不需要currentThread 前缀来调用诸如,等方法?例如,当没有实例时,静态调用如何准确地知道我们“定位”的线程实例是什么?sleep()yield()interrupted()Thread.sleep()

标签: javamultithreading

解决方案


当没有实例时,静态调用例如 Thread.sleep() 如何确切知道我们“定位”的线程实例是什么?

它们以当前执行的线程为目标。

来自Thread的文档:

使当前执行的线程休眠

yield等文档interrupted还提到它们会影响当前线程。

关于评论joingetName

join静态化是没有意义的。如果你这样做了,你唯一可以加入的线程就是当前线程,它会立即死锁。您将要求当前线程等待自身。join必须是非静态的,所以你可以告诉它等待哪个线程(好吧,你可以有static join(Thread threadToJoin),但这很麻烦)。

Sleep 和 yield 仅在静态上才有意义——你永远不会告诉另一个线程 sleep 或 yield(你不知道另一个线程在做什么——它可能不处于 sleep 或 yield 的合理状态)。你只想让自己入睡。

您在评论中提到的其他方法可能具有静态变体,但它们是非静态的更有意义,因为它们提供有关它们被调用的特定 Thread 对象的信息。您可能会注意到interruptedandisInterrupted分别是静态和非静态的,因此在某些情况下提供两者是有意义的。值得拥有静态getCurrentThreadName()方法吗?可能不是。我们不经常查找线程名称,但检查中断是一种非常常见的操作,因此不必说的方便Thread.currentThread().isInterrupted()超过了维护两种方法的成本。


推荐阅读