繁体   English   中英

为什么main是我每次执行以下代码时第一个在以下代码中执行的线程

[英]Why main is the first thread to get executed in the following code every time i execute the code

每次我执行以下代码时,即使我已经在下面的代码中打印了主线程的名称以打印其他线程的名称(执行顺序),主线程也会每次都首先执行。

这是代码。

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虚拟机的实现者提供了自由,使其可以使用操作系统进行线程切换,而不必将其限于特定的操作系统。

同样,在大多数操作系统上,线程的顺序是不确定的且不确定的。 知道操作系统内部可以揭示特定的行为和确定性,但是,这是反向工程知识,并且该操作系统的未来版本可能随时更改该行为(除非它是该操作系统“行为合同”的正式组成部分,对于大多数情况而言)操作系统不是)。

如果需要以指定的确定性方式执行线程,则需要对其进行同步。 一种实现方法是在synchronized块中使用java.lang.Object.wait()java.lang.Object.notify()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM