当前位置: 首页 > 面试题库 >

内存中的线程如何执行?

戚建德
2023-03-14
问题内容

我正在学习有关 线程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

谁能帮助我了解输出的顺序。提前致谢。


问题答案:

*从本质 *上讲线程 是相互 并发的
。这意味着,两个(或多个)线程在同时执行时会争用同一资源(CPU),并且CPU会按照对您的随机(不可预测)顺序将自己从一个执行切换为另一个执行。您不能也不知道您的CPU和OS体系结构将决定跳转到哪个执行路径(线程)。此外,在某些语言中,这可能是
OS体系结构 的问题,在某些情况下- 仅是 CPU体系结构 的问题,在某些情况下- 两者都有
。这取决于该语言的体系结构如何管理线程。


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

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



 类似资料:
  • null null 为了进行简单的开发,我使用在独立集群模式下(8个工作者、20个内核、45.3G内存)执行了我的Python代码。现在我想为性能调优设置执行器内存或驱动程序内存。 在Spark文档中,执行器内存的定义是 每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512M、2G)。

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....

  • 我知道线程是并发运行的,所以您无法预测执行的顺序,但在提供的代码中,我在运行其他代码之前加入了thread。如果应该等到线程执行完毕,那么为什么顺序仍然是随机的呢?在两个print语句之前加入任何内容总是会导致它们最后被打印,而如果我在之后加入所有内容,它并不总是最后,为什么?

  • 问题内容: 我一直在尝试解决涉及使用wait()和notify()的线程通信的问题。基本上我有2个线程T1和T2,我希望它们按以下顺序执行 T1,T2,T1,T2 .....我该如何实现? 实际的问题:有两个线程T1-打印奇数(例如1-100),而T2-打印偶数(1-100)。现在,输出应为1,2,3,4,5,.... 100 问题答案: 您描述了生产者-消费者模式。 它是Java的实现,在许多J

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下:

  • 我需要监控应用程序生成的线程所消耗的内存量。如果贪婪的线程占用了太多内存,那么我们可以采取纠正措施。我提到了我的java线程需要多少内存?。关于该链接的建议之一是在ThreadMXBean中使用getThreadAllocatedBytes 我用以下作业试验了getThreadAllocatedBytes。 我在四个线程上运行了相当长的时间。虽然作业不会连续累积内存,但getThreadAlloc