JAVA线程的执行顺序
我试着从一本书(Paul Hyde,Java线程编程)中运行这个示例。它说线程的顺序将交换。但我总是得到:10张“主线”照片和10张“新线”照片。 更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将是相反的。也许是因为这本书很老,而且示例基于JDK1.2???代码如下:JAVA线程的执行顺序,java,multithreading,Java,Multithreading,我试着从一本书(Paul Hyde,Java线程编程)中运行这个示例。它说线程的顺序将交换。但我总是得到:10张“主线”照片和10张“新线”照片。 更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将是相反的。也许是因为这本书很老,而且示例基于JDK1.2???代码如下: public class TwoThread extends Thread { public void run() { for (int i = 0; i < 10; i
public class TwoThread extends Thread
{
public void run()
{
for (int i = 0; i < 10; i++)
{
System.out.println("New thread");
}
}
public static void main(String[] args)
{
TwoThread tt = new TwoThread();
tt.start();
for (int i = 0; i < 10; i++)
{
System.out.println("Main thread");
}
}
}
公共类TwoThread扩展线程
{
公开募捐
{
对于(int i=0;i<10;i++)
{
System.out.println(“新线程”);
}
}
公共静态void main(字符串[]args)
{
TwoThread tt=新的TwoThread();
tt.start();
对于(int i=0;i<10;i++)
{
System.out.println(“主线程”);
}
}
}
JVM决定何时将控制权从主线程转移到第二个线程。由于主线程在启动第二个线程后不会执行太多工作,因此JVM允许它在将控制权转移到第二个线程之前完成其工作是有意义的
当您使用tt.run()
而不是tt.start()
时,您不会启动第二个线程。您正在主线程中执行run()
方法。因此,您将首先看到“新线程”
输出
如果我将使用tt.run而不是tt.start,那么结果将是相反的
tt.run
仅在main
线程中运行,而tt.start
生成另一个线程。因此,结果是可以预期的
关于一致性:
对于较小且快速的活动,您可能会偶尔看到一致的结果,但这并不意味着您看到的打印顺序是有保证的。如果使用
tt.run(),则将循环迭代次数增加到更高的数字,并查看打印顺序(例如打印多达10000次)代码>您只有一个线程(由于您首先调用该方法,它将首先打印“新线程”)。这是start()代码>调用,创建并启动一个实际的新执行线程。尝试循环到1000,您就会知道。是的,如果循环次数过多,它会起作用。您永远不应该对线程的执行顺序做出假设。这就是同步原语存在的原因。这还取决于机器是否有多核处理器,以及是否支持超线程。JVM不在线程之间“转移控制”,而是同时运行这两个线程。即使在单核非ht处理器上,一旦两个线程都运行(在任何执行抢占式多任务的操作系统上),排序也是完全随机的。在Leo的示例中,使用某种程度上可预测的顺序的原因是线程启动时间。