受Thread.yield()影响的线程?
这里是一个多线程的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()
更清楚吗?有没有人有关于此的想法?
由于在这种情况下“当前线程”的Javadoc意味着
在你的情况“调用该方法Thread.yield()
线程”,这是启动应用程序的主线程。
正如Javadoc解释的那样,通常不需要拨打Thread.yield()
。它不需要做任何事情:
一个提示当前线程愿意得到 其目前使用的处理器的调度。调度程序可以*地忽略这个 提示。
它似乎做了一些事情,至少到Java 6 - 找不到Java 7/8的参考。
的Windows:
的HotSpot虚拟机现在使用Windows
SwitchToThread()
API调用实现Thread.yield()
。此调用使当前线程放弃当前时间片 ,但不是其全部量子。
的Linux:
在Linux下,热点只是调用
sched_yield()
。这个呼叫的后果是 有点不同,并且可能比在Windows下的 更严重。
不只是这个问题。当几乎_any_方法的文档中出现“当前线程”时,它表示“调用该方法的线程”。 –
主线程将受到影响。 您始终可以使用Thread.currentThread().getName()
来获取当前的线程名称。 你也可以做
Thread.currentThread().yield()
其他线程运行的run方法,直到它完成,比出口。
它被称为'currentThread()'(带't'而不是'd'),它是一个函数 - 不是字段 - 所以你应该在其后面加上括号'()'来调用函数。 –
当前线程受到影响,即调用该方法的线程。
是不是应该更明确地说myThread.yield()而不是Thread.yield()?有没有人有关于此的想法?
不,它不是。这是一个静态方法,并且它是很好的规定。在这种情况下,它也会表达与实际发生的情况相反的情况。
但它也毫无意义。 yield()
函数自从Windows 98的16位部分以来没有做过任何有用的工作。无论如何,您的线程将被重新调度,因为调度程序认为合适。
在你的情况下,'Thread.yield'将产生 “主” 线程在'main'运行 – MadProgrammer
另见: http://*.com/questions/ 1600572/are-thread-sleep0-and-thread-yield-statements-equivalent- –