Java 当有多个处理器时,Thread.currentThread()如何工作?
Java 当有多个处理器时,Thread.currentThread()如何工作?,java,multithreading,multicore,Java,Multithreading,Multicore,Thread.currentThread()可用于获取当前正在执行的线程。我认为sleep和yield方法都是静态的,因为它们不能在其他线程上执行sleep或yield。因此,通过使它们保持静态,它将休眠或只产生当前正在执行的线程 这似乎在单处理器系统中工作,如果我调用Thread.currentThread()或sleep,则只有当前正在运行的线程,它将返回或将休眠。但在多核系统中,多个线程可以同时运行 那么Thread.currentThread()或Thread.sleep()是如何工作的
Thread.currentThread()
可用于获取当前正在执行的线程。我认为sleep和yield方法都是静态的,因为它们不能在其他线程上执行sleep或yield。因此,通过使它们保持静态,它将休眠或只产生当前正在执行的线程
这似乎在单处理器系统中工作,如果我调用Thread.currentThread()
或sleep,则只有当前正在运行的线程,它将返回或将休眠。但在多核系统中,多个线程可以同时运行
那么
Thread.currentThread()
或Thread.sleep()
是如何工作的呢?它只对“当前”线程有效。在多核系统中,如果您的代码是单线程的,则只有一个线程正在运行,这是当前线程,因此此代码将在该线程上运行。如果您有多线程程序,此代码将在调用它的线程中工作。核心的数量其实并不重要。Java将线程和负载分配给不同的内核,但从代码的角度来看,处理器的数量并不重要 这些方法是静态的,因为您可以访问执行该代码的核心/CPU的当前执行线程
如果有多个内核或CPU处理器,则通过此代码的每个内核都将返回到自己的线程
因此,您不必关心系统中有多少个内核/CPU,这些方法在单核和多核系统的两种情况下都适用
请记住,Java
Thread
是OS real Thread(posix、windows…)的抽象,因此您可以编写程序,而不必考虑OS架构。在这种情况下,文档非常糟糕。Thread.currentThread()
返回的实际上是执行该行代码的线程。因此,在这种情况下,您是否处于多处理器环境并不重要
当您有两个线程
ThreadA
和ThreadB
完全并行运行,同时请求Thread.currentThread()
并行运行时,您将得到执行此操作的相应线程。方法Thread.currentThread()
返回当前正在运行的线程。这只是一种表达方式:“嘿,给我一个运行我的线程的引用”
假设我们有四个内核,四个线程A、B、C和D完全并发运行,同时调用此方法,它将根据我们当前所在的线程适当地返回A、B、C和D
和方法Thread.currentThread().sleep()
或Thread.sleep()
基本上做相同的工作。根据currentThread()的说明:
公共静态线程currentThread()
返回对当前执行的线程对象的引用
及
公共静态无效睡眠(长毫秒)引发中断异常
根据系统计时器和调度程序的精度和准确性,使当前执行的线程休眠(暂时停止执行)指定的毫秒数。线程不会失去任何监视器的所有权
这完全是操作系统特有的;JVM在这里的作用是使这些工作准确无误。只是澄清已经给出的答案:当前并不意味着当前正在执行。它的意思是调用静态方法的线程。这个名称是古代只有一个CPU的遗留物。当时,调用该方法的线程实际上是当前线程。currentThread.sleep和thread.sleep之间的区别是什么?