【问题标题】:Threads affected by Thread.yield()?受 Thread.yield() 影响的线程?
【发布时间】:2015-07-01 02:05:54
【问题描述】:

这是一个多线程的HelloWorld:

public class HelloWorld {

    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new Thread() {
            public void run() {
                System.out.println("Hello World from new thread");
            }
        };
        myThread.start();
        Thread.yield();
        System.out.println("Hello from main thread");
        myThread.join();
    }
}

据我了解,在myThread.start() 之后,将会有两个线程在运行。一个是主线程,另一个是新创建的myThread。那么,Thread.yield()中引用了哪个线程?

我查看了 Java SE6 Doc,上面写着

Thread.yield():使当前正在执行的线程对象 暂时暂停并允许其他线程执行

但是在代码中,我看不清楚currently excuting thread是什么,看起来两个线程同时运行

myThread.yield()而不是Thread.yield()不是更清楚吗?有人对此有想法吗?

【问题讨论】:

标签: java multithreading concurrency


【解决方案1】:

主线程会受到影响。 您始终可以使用Thread.currentThread().getName() 来获取当前线程名称。 你也可以做

 Thread.currentThread().yield()

另一个线程正在运行 run 方法,直到它完成然后退出。

【讨论】:

  • 它被称为currentThread()(带有't'而不是'd'),它是一个函数——不是一个字段——所以你应该在它后面加上括号()来调用函数.
【解决方案2】:

在此上下文中使用“当前线程”,Javadoc 表示“调用方法 Thread.yield() 的线程”

在您的情况下,这是启动您的应用程序的主线程。

正如 Javadoc 所解释的,通常不需要调用 Thread.yield()。不需要做任何事情:

向调度程序提示当前线程愿意让步 它当前使用的处理器。调度器可以随意忽略这个 提示。

它似乎确实做了一些事情,至少到 Java 6 - 找不到 Java 7/8 的参考。

窗户:

Hotspot VM 现在使用 Windows 实现 Thread.yield() SwitchToThread() API 调用。此调用使当前线程放弃 它的当前时间片,但不是它的整个时间片。

Linux:

在 Linux 下,Hotspot 只调用sched_yield()。的后果 这个电话有点不同,可能比下面更严重 窗户。

来源:http://www.javamex.com/tutorials/threads/yield.shtml

【讨论】:

  • 不只是这个上下文。当“当前线程”出现在几乎任何方法的文档中时,它的意思是“调用该方法的线程”。
【解决方案3】:

当前线程受到影响,即调用该方法的线程。

用 myThread.yield() 代替 Thread.yield() 不是更清楚吗?有人对此有想法吗?

不,不是。它是一种静态方法,并且指定得很清楚。在这种情况下,它也会传达与实际发生的相反的情况。

但这也是没有意义的。 yield() 函数自 Windows 98 的 16 位部分以来没有做任何有用的事情。无论如何,如果调度程序认为合适,您的线程将被重新调度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2015-09-08
    • 2018-03-27
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多