每次我执行以下代码时,主线程每次都会首先执行,即使我在打印其他线程名称的代码(执行顺序)下方编写了打印主线程名称的代码。
这是代码。
import java.io.*;
class Thh implements Runnable
{
public void run()
{
for(int i=0;i<5;i++)
{
System.out.println(Thread.currentThread().getName());
try{
Thread.sleep(1000);
}catch(Exception e){System.out.println(e);}
}
}
}
class Runth
{
public static void main(String s[])
{
Thh t1=new Thh();
Thread tt1=new Thread(t1,"thread1");tt1.start();
Thh t2=new Thh();
Thread tt2=new Thread(t2,"thread2");tt2.start();
for(int i=0;i<5;i++)
{
System.out.println(Thread.currentThread().getName());
try{
Thread.sleep(1000);
}catch(Exception e){System.out.println(e);}
}
}
}
最佳答案
不同Java线程的执行顺序是未指定且不确定的。当我第一次运行你的代码时,前三行是
thread1
thread2
main
当我第二次运行它时,这些行是
main
thread2
thread1
这种非确定性和缺乏规范是故意的。它为 Java 虚拟机的实现者提供了使用操作系统进行线程切换的自由,而不限于特定的操作系统。
此外,在大多数操作系统上,线程的顺序是未指定且不确定的。了解操作系统内部结构可以揭示特定的行为和决定论,但是,这是逆向工程知识,操作系统的 future 版本可能会随时更改行为(除非它是操作系统“行为契约”的正式部分,这对于大多数人来说)操作系统则不然)。
如果需要以指定的、确定性的方式执行线程,则需要同步它们。一种方法是使用 java.lang.Object.wait()
和java.lang.Object.notify()
在synchronized
block 。
关于java - 为什么每次执行以下代码时 main 是第一个执行的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35254119/