Thread类中的方法和Thread.currentThread()中使用的方法之间的区别



我想从方法currentThread((的doc开始:

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

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

我的问题是,我们如何不需要currentThread前缀来调用方法,如sleep()yield()interrupted()等?当没有实例时,静态调用(例如Thread.sleep()(如何确切知道我们"瞄准"的线程实例

在没有实例的情况下,静态调用(例如Thread.sleep(((如何准确地知道我们要"瞄准"哪个线程实例?

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

来自Thread:的文档

使当前执行的线程休眠

yieldinterrupted等的文档也提到它们会影响当前线程。

关于joingetName等的意见:

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

睡眠和屈服只有在静态的情况下才有意义——你永远不会告诉另一个线程睡眠或屈服(你不知道其他线程在做什么——它可能不处于睡眠或屈服的合理状态(。你只想让自己入睡。

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

例如为什么写入Thread.sleep()而不是Thread.currentThread().sleep()

因为sleep()不是一个线程应该能够对另一个线程执行的操作。

Thread.currentThread()返回对Thread类的实例的引用。从调用方的角度来看,它是一个特殊的实例(即,它恰好是调用函数的Thread(,但从语言的角度看,它根本没有什么特殊之处。这只是一个线程。

也就是说,如果你能打Thread.currentThread().foo(),那么你就可以打someOtherThread.foo()

即使允许您拨打someOtherThread.sleep(),这也是一个非常糟糕的主意。这就是为什么他们使sleep()成为一个static方法,隐式地对调用线程进行操作。


我的问题是我们如何不需要currentThread前缀。。。

好吧,这只是我的两美分,但如果你认为currentThread()是某种前缀,那么我建议你在开始编写多线程程序之前,花更多时间学习Java语言的基础知识。

最新更新