首页 > 解决方案 > 为什么 java.lang.Thread 中覆盖的 run 方法会产生奇怪的输出?

问题描述

我运行了以下代码。

public class ThreadDemo extends Thread{
      public void run(){ 
            System.out.println("running thread name 
                    is:"+Thread.currentThread().getName());

             System.out.println("Current Thread Priority 
                    is"+Thread.currentThread().getPriority());
    }

     public static void main(String args[]){
         ThreadDemo t1=new ThreadDemo();
         ThreadDemo t2=new ThreadDemo();

         t1.start();
         t2.start();

 }
} 

我希望得到以下输出:

running thread name is:Thread-0
running thread priority is:5
running thread name is:Thread-1
running thread priority is:5

但是每次运行代码时,我都会得到相同的输出。

running thread name is:Thread-0
running thread name is:Thread-1
running thread priority is:5
running thread priority is:5

为什么第一个 System.out.println 打印两次,然后第二个 System.out.printlln 打印两次?为什么会有这种奇怪的行为?

标签: multithreading

解决方案


想象一场 100 米的比赛。法官开枪,赛跑者开始奔跑。您期望的是,1 号跑步者开始,通过 50m 和 100m 标记,然后 2 号跑步者开始,通过 50m 和 100m 标记。

但这不是比赛的运作方式。实际发生的是它们并行运行。他们都开始(一个可能比另一个快一点),都通过中途(一个或另一个顺序),都完成(可能以相同的顺序,也许一个人得到了突飞猛进的速度)。他们中的一个可能会绊倒,甚至在另一个跑过终点线之前还没有到达中点;但这是一种罕见的情况,很难预料。人们应该期望在比赛中具有类似技能的跑步者或多或少地并行运行。

这就是“并行”的含义,也是多线程首先存在的原因。每个线程都是一个运行器,它在您告诉它时启动,并与任何其他现有线程并行运行。如果你想按顺序执行你的代码——作为一个接力,而不是一场竞赛(即用你的话来说“不奇怪”)——你可能不应该使用多线程:)


推荐阅读