Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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.yield()会做些什么吗?_Java_Multithreading_Concurrency_Java Threads_Thread Synchronization - Fatal编程技术网

Java 如果我们有足够的处理器为所有线程提供服务,Thread.yield()会做些什么吗?

Java 如果我们有足够的处理器为所有线程提供服务,Thread.yield()会做些什么吗?,java,multithreading,concurrency,java-threads,thread-synchronization,Java,Multithreading,Concurrency,Java Threads,Thread Synchronization,如果我们在一台有两个处理器的机器上有两个正在运行的线程,并且我们在其中一个线程中调用Thread.yield(),那么什么都不会发生是合理的吗(调度器基本上会忽略该请求)因为我们有足够的处理器为运行中的线程提供服务?每当线程调用thread.yield()方法时,它都会向线程调度程序发出一个提示,提示它准备暂停执行。线程调度程序可以随意忽略此提示 如果任何线程执行yield方法,线程调度程序将检查是否有任何可运行(等待执行)线程具有与此线程相同或高优先级。如果处理器发现任何具有更高或相同优先级的

如果我们在一台有两个处理器的机器上有两个正在运行的线程,并且我们在其中一个线程中调用
Thread.yield()
,那么什么都不会发生是合理的吗(调度器基本上会忽略该请求)因为我们有足够的处理器为运行中的线程提供服务?

每当线程调用
thread.yield()
方法时,它都会向线程调度程序发出一个提示,提示它准备暂停执行。线程调度程序可以随意忽略此提示

如果任何线程执行yield方法,线程调度程序将检查是否有任何可运行(等待执行)线程具有与此线程相同或高优先级。如果处理器发现任何具有更高或相同优先级的线程,那么它将切换到新线程。否则,当前线程将继续执行

因为,在您的示例中,您有足够的处理器为所有线程提供服务(它们正在运行,而不是在可运行状态下等待)
Thread.yield()
将不执行任何操作,线程将继续执行

有关Windows的说明,来自Microsoft DOTNet:

此方法相当于使用平台调用来调用本机 Win32函数

让步仅限于执行调用的处理器 线操作系统不会将执行切换到另一个 处理器,即使该处理器空闲或正在运行 低优先级。如果没有其他线程准备好 在当前处理器上执行时,操作系统不会产生 执行

因此,在某些情况下可能会有一些警告。

Thread.yield()已经过时。除非您的程序将在实现的平台上运行,或者在仍在使用的JVM上运行,否则调用它是没有意义的


标准库有效地说明了
yield()
根本不需要做任何事情。

我一直认为
Thread::yield
应该被
Thread::onSpinWait
取代(从java 9开始)-这只是一种“较弱”的收益形式,直到我在
StampedLock
中看到了这两种用法:

    else if ((LockSupport.nextSecondarySeed() & OVERFLOW_YIELD_RATE) == 0)
        Thread.yield();
    else
        Thread.onSpinWait();
    return 0L;
所以我不认为这是过时的。在jdk源代码内部,它有许多用法,甚至相对较新的
ForkJoinPool
也有
Thread::yield
的用法

实际上,我只在繁忙的旋转中使用了
Thread::onSpinWait
,因为至少从它的名称来看,何时使用它是非常清楚的;另一方面,屈服不是——所以我不能确定何时以及如何使用它


只有我的0.02美元。

在您的回答中,您没有提到可用于运行线程的处理器数量。这是如何考虑的?具体来说,我的示例涉及两个处理器和两个线程。请注意,您的操作系统肯定会运行许多其他进程,有些进程可能需要CPU时间。@Dave,Re,“…触摸处理器的数量…”处理器的数量与此无关
Thread.yield()
,如果它做了任何事情,它会告诉调度程序调用方(a)仍有工作要做,(b)不想放弃正在运行的处理器,但是(c)如果其他线程需要,它愿意放弃处理器。唯一重要的处理器是调用方运行的处理器。唯一重要的数字是希望处理器在其上运行的其他线程的数量(特别是,该数字是零还是大于零)。永远不会有任何具有更高优先级的就绪线程-它们可能已经在运行:)FWIW,调用
Thread.yield()
是一种温和的代码气味。这不像调用
sleep()
那么糟糕,但当我看到它时,我肯定会产生怀疑。通常,当线程应该等待监视器、侦听事件、注册异步回调等时,它会被轮询更改的线程使用。@JohnKugelman似乎如果涉及等待,java-9中添加了
Thread::onSpinWait
。我仍然不知道应该在何时使用哪一个。我怀疑它已经过时了——看看jdk类内部——它有很多用法。写一个库,你不知道它将在哪里运行。