受Thread.yield()影响的线程?

时间:2015-04-23 05:03:08

标签: java multithreading concurrency

这是一个多线程的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()更清楚吗?有没有人有这方面的想法?

3 个答案:

答案 0 :(得分:5)

在此上下文中使用“当前线程”,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

答案 1 :(得分:4)

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

  

是不是更清楚地说myThread.yield()而不是Thread.yield()?有没有人有这方面的想法?

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

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

答案 2 :(得分:0)

主线程将受到影响。 您总是可以Thread.currentThread().getName()来获取当前的线程名称。 你也可以做到

 Thread.currentThread().yield()

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