这是一个多线程的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()
更清楚吗?有没有人有这方面的想法?
答案 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()
。后果 这个电话有点不同,可能比下面更严重 视窗。
答案 1 :(得分:4)
当前线程受到影响,即调用该方法的线程。
是不是更清楚地说myThread.yield()而不是Thread.yield()?有没有人有这方面的想法?
不,不是。它是一种静态方法,并且指定得很好。在这种情况下,它也会传达与实际情况相反的情况。
但它也毫无意义。自从Windows 98的16位部分以来,yield()
函数没有做任何有用的事情。无论如何,当调度程序认为合适时,您的线程将被重新安排。
答案 2 :(得分:0)
主线程将受到影响。
您总是可以Thread.currentThread().getName()
来获取当前的线程名称。
你也可以做到
Thread.currentThread().yield()
另一个线程正在运行run方法,直到完成并退出。