我想从方法currentThread((的doc开始:
- 返回对当前执行的线程对象的引用
- @返回当前正在执行的线程
现在知道了这一点,方法如join()
、isAlive()
、getName()
、isInterrupted()
等被这样调用是有道理的,例如Thread.currentThread().join
。
我的问题是,我们如何不需要currentThread
前缀来调用方法,如sleep()
、yield()
、interrupted()
等?当没有实例时,静态调用(例如Thread.sleep()
(如何确切知道我们"瞄准"的线程实例
在没有实例的情况下,静态调用(例如Thread.sleep(((如何准确地知道我们要"瞄准"哪个线程实例?
它们以当前执行的线程为目标。
来自Thread:的文档
使当前执行的线程休眠
yield
和interrupted
等的文档也提到它们会影响当前线程。
关于join
、getName
等的意见:
将join
设为静态是没有意义的。如果您这样做了,那么唯一可以加入的线程将是当前线程,该线程将立即死锁。您将要求当前线程等待它自己。join
必须是非静态的,这样你就可以告诉它等待哪个线程(好吧,你可以有static join(Thread threadToJoin)
,但这很麻烦(。
睡眠和屈服只有在静态的情况下才有意义——你永远不会告诉另一个线程睡眠或屈服(你不知道其他线程在做什么——它可能不处于睡眠或屈服的合理状态(。你只想让自己入睡。
你在评论中提到的其他方法可能有静态变体,但它们是非静态的更有意义,因为它们提供了关于它们被调用的特定线程对象的信息。你可能会注意到interrupted
和isInterrupted
分别是静态的和非静态的,所以在某些情况下,同时提供这两种方法是有意义的。有一个静态的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语言的基础知识。