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

标签 java multithreading

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

这是代码。

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/

相关文章:

java - 无法使用 Spring Boot 和 JPA 在 MySQL 8 DB 中插入数据

java - DAO Hibernate Java Select All rows into a collection

java - 公历给我 2018 年 int 月份 = calendar.get(Calendar.FEBRUARY)

python - 从辅助线程使用Flask SQLAlchemy

c++ - 为什么我在使用 qt 等待条件时不必包含锁定/解锁语句?

java - 如何实现多对一映射的数据结构?

python - Matplotlib图形卡在线程中。使用Thread.join()

c - 多线程发送器

python - 通过 Python 和 Eventlet 使用多核

java - Thymeleaf 模板 :data=http://www. somesite.com || org.thymeleaf.exceptions.TemplateProcessingException:无法解析为分配序列