java - 线程是如何在内存中执行的?

标签 java multithreading

我正在学习 Java 中的Thread。我试图获取正在运行的线程。但是,我无法理解输出的顺序。

以下是我的代码

public class practice extends Thread {

public void run(){  
      for(int i=1;i<4;i++){  
         
        System.out.println(i); 
        System.out.println(Thread.currentThread().getName()); 
      }  
     
     }  

public static void main(String[] args) {
    
    practice t1=new practice();  
      practice t2=new practice();  
      practice t3=new practice();  
      
      t1.start();  
      t2.start(); 
      t3.start(); 
    }

}

输出:

1
1
1
Thread-1
2
Thread-1
3
Thread-1
Thread-0
2
Thread-0
3
Thread-0
Thread-2
2
Thread-2
3
Thread-2

任何人都可以帮助我理解输出的顺序。提前致谢。

最佳答案

线程本质上是彼此并发。这意味着,两个(或多个)线程在同时执行时会竞争相同的资源 (CPU),并且 CPU 会以随机(不可预测)的顺序从执行一个线程切换到执行另一个线程。您无法也不会知道您的 CPU 和操作系统架构将决定跳转到哪个执行路径(线程)。此外,在某些语言中,这可能是操作系统架构的问题,在某些语言中,这可能只是CPU架构的问题,而在某些语言中,这可能是两者的问题。这取决于该语言的体系结构如何管理线程。

请注意,即使两个线程是并行 - 即它们在两个不同的内核上并行执行 - 您仍然无法预测哪个内核将首先执行指令。

由于上述几点,您每次运行代码时可能会得到不同的执行顺序。

关于java - 线程是如何在内存中执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62857956/

相关文章:

c++ - fetch_sub 和 memory_order_relaxed 用于原子引用计数?

java - 关于Java中的线程和回调的问题

c++ - 多线程文件流

c# .Net 4.5 线程间通信

ios - prepareForSegue 中出现“从不正确的线程访问的 Realm ”错误; swift

java - 使用 Java 从 Oracle DB 获取 200,000 条记录时出现 OOM 错误

java - printf %f 小数点后只有 2 个数字?

java - 将 REST 客户端与 header 一起使用时获取 ssl.SSLHandshakeException 但与 PostMan 一起使用时效果很好

java - Hibernate 框架 - 返回重复字段

java - Eclipse插件中使用fragment替换资源文件