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

问题描述 投票:0回答:2

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

以下是我的代码

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

任何人都可以帮我理解输出的顺序。预先感谢。

java multithreading
2个回答
4
投票

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

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

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


1
投票

首先..请格式化您的代码以获得更好的可见性。然后使用java命名约定。要找到它们,请看这里。 看来你是线程的初学者,乍一看不理解它们是完全可以的。意外的顺序与操作系统调度和并发执行指令而不是方法的概念有关,这意味着并发执行并不意味着该 run 方法将同时运行,这意味着该方法中的所有内容(每条指令)都可以/将同时运行。 继续学习线程(也许)是 Java 最困难的领域,但也是最有趣的领域。

© www.soinside.com 2019 - 2024. All rights reserved.