Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当有多个处理器时,Thread.currentThread()如何工作?_Java_Multithreading_Multicore - Fatal编程技术网

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之间的区别是什么?