java - Thread 类的方法与 Thread.currentThread() 使用的方法之间的区别?
问题描述
我想从方法 currentThread() 的文档开始:
- 返回对当前正在执行的线程对象的引用。
- @return 当前正在执行的线程。
现在知道了这一点,例如,像这样调用诸如、、等方法是有道理的。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)
,但这很麻烦)。
Sleep 和 yield 仅在静态上才有意义——你永远不会告诉另一个线程 sleep 或 yield(你不知道另一个线程在做什么——它可能不处于 sleep 或 yield 的合理状态)。你只想让自己入睡。
您在评论中提到的其他方法可能具有静态变体,但它们是非静态的更有意义,因为它们提供有关它们被调用的特定 Thread 对象的信息。您可能会注意到interrupted
andisInterrupted
分别是静态和非静态的,因此在某些情况下提供两者是有意义的。值得拥有静态getCurrentThreadName()
方法吗?可能不是。我们不经常查找线程名称,但检查中断是一种非常常见的操作,因此不必说的方便Thread.currentThread().isInterrupted()
超过了维护两种方法的成本。
推荐阅读
- java - How do we measure the total time taken to complete a flow across two different java applications?
- ipython - 氢将“-f”传递给 ArgumentParser
- c# - ASP.NET MVC C# - 使用 URL ACTION 传递动态参数
- java - 如何在 ElasticSearch 中使用相同类型或索引的连接,如 solr
- html - 加载时无法在移动浏览器上播放音频
- hybris - Hybris 商店创建
- django - 无法连接到 amqp://guest:**@127.0.0.1:5672//: [Errno 111] 连接被拒绝
- sql-server - 如何在 MSSQL 中将 YYYY-MM-DD HH:MI:SS 格式转换为 MM-DD-YYYY HH:MI:SS
- ruby - 我怎样才能跳出双'if'块?
- php - 雄辩的关系没有输出