当前位置: 首页 > 知识库问答 >
问题:

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

有品
2023-03-14

如果我们在一台有两个处理器的机器上有两个正在运行的线程,我们调用线程。yield()?


共有3个答案

张敏达
2023-03-14

我一直认为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::的用法。

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

只有我的0.02美元。

艾英范
2023-03-14

Thread.yield()已过时。除非您的程序要在实现协作多任务的平台上运行,或者在仍然使用绿色线程的JVM上运行,否则调用它是没有意义的。

Thread.yield()的标准库Javadoc有效地表明产量()根本不需要做任何事情。

益兴生
2023-03-14

每当线程调用线程时。yield()。线程调度程序可以随意忽略此提示。

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

因为,在您的示例中,您有足够的处理器为所有线程提供服务(它们正在运行,而不是在可运行状态下等待)<代码>线程。yield()将什么也不做,线程将继续执行。

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

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

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

所以在某些情况下可能会有一些警告。

 类似资料:
  • 我有一个用C#编写的grpc服务,它有2个调用,如Start和Stop。当客户端调用Start(这个调用需要很多时间),然后Stop服务器同步处理请求,而grpc启动了4个线程。 您能帮我了解它是否按设计运行,或者我错过了任何其他设置吗?

  • 问题内容: 这是我昨晚被拒绝的采访中唯一无法回答的两个问题。 问题答案: 问:什么时候应该使用多线程? 答:“您的问题非常广泛。只有很少的一个线程可以简单,快速和可靠地满足功能,这是非平凡的系统。例如:[选择目标公司出售的典型系统并挑选一个它的功能的两个方面会更好地发挥作用- 繁重的CPU,通信,多用户-只是选择一些可能的原因并进行解释]。 问:如果不同的线程执行相互独立的任务,多线程会有所好处吗

  • 我的后端是一个运行在ubuntu Linux中的nodejs应用程序。当有来自客户端的请求时,它需要nodejs子进程。子过程通常需要不到20秒的时间来完成。如果有许多并发请求进入,则需要管理这些进程。我正在考虑将进程移动到docker容器中。这意味着将创建一个新的docker容器来运行流程,如果有来自客户端的请求。这样,我就可以使用kubernetes来管理这些docker容器。我不确定这是不是

  • 我有许多维护自己数据库的微服务(mongodb、弹性、mysql),并且我必须不断设置新连接的每个微服务。 我在考虑如果我创建另一个微服务,可以在微服务启动之前处理这些连接,这是否明智。 示例:我的API网关微服务收到一个搜索请求,然后调用搜索微服务,在搜索开始之前,该服务调用数据库设置miscroservice,并根据微服务的名称(在本例中为搜索微服务)返回已建立的连接。 如果我只是发现 API

  • 这是一个扩展Thread并实现run()函数的类: 现在在主活动中的一个按钮中,我有这样的代码: 据我所知,这应该将runnable放在目标线程的消息队列中,并且线程(不是UI线程)将在可能的情况下运行它。但此代码会阻止 UI。为什么会发生这种情况?如您所见,我将目标线程的循环器发送到处理程序构造函数,并且处理程序应使用该循环器而不是主线程的循环程序。

  • 我有一个应用程序,它的工作是启动和停止各种其他进程。 问题在于Qt应用程序不会完全停止。Qt 窗口关闭,但进程仍在后台运行,直到调用 TerminateProcess(), 然后 Qt 应用程序退出而不清理。 我正在使用微软概述的这种方法。甚至Qt源代码也使用这种方法来终止进程,除了他们也向主线程发布WM_CLOSE。我也已经将其添加到我的应用程序中,但它仍然只是关闭窗口,离开进程。 我发现有趣的