2015-04-23 99 views
2

这里是一个多线程的HelloWorld:受Thread.yield()影响的线程?

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文件,它说

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

但在代码,我无法清楚地看到currently excuting thread是什么,看起来两个线程都在同一时间运行

难道说myThread.yield()而不是Thread.yield()更清楚吗?有没有人有关于此的想法?

+0

在你的情况下,'Thread.yield'将产生 “主” 线程在'main'运行 – MadProgrammer

+0

另见: http://stackoverflow.com/questions/ 1600572/are-thread-sleep0-and-thread-yield-statements-equivalent- –

回答

5

由于在这种情况下“当前线程”的Javadoc意味着

在你的情况“调用该方法Thread.yield()线程”,这是启动应用程序的主线程。

正如Javadoc解释的那样,通常不需要拨打Thread.yield()。它不需要做任何事情:

一个提示当前线程愿意得到 其目前使用的处理器的调度。调度程序可以自由地忽略这个 提示。

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

的Windows:

的HotSpot虚拟机现在使用Windows SwitchToThread() API调用实现Thread.yield()。此调用使当前线程放弃当前时间片 ,但不是其全部量子。

的Linux:

在Linux下,热点只是调用sched_yield()。这个呼叫的后果是 有点不同,并且可能比在Windows下的 更严重。

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

+0

不只是这个问题。当几乎_any_方法的文档中出现“当前线程”时,它表示“调用该方法的线程”。 –

0

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

Thread.currentThread().yield() 

其他线程运行的run方法,直到它完成,比出口。

+1

它被称为'currentThread()'(带't'而不是'd'),它是一个函数 - 不是字段 - 所以你应该在其后面加上括号'()'来调用函数。 –

4

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

是不是应该更明确地说myThread.yield()而不是Thread.yield()?有没有人有关于此的想法?

不,它不是。这是一个静态方法,并且它是很好的规定。在这种情况下,它也会表达与实际发生的情况相反的情况。

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