【问题标题】:Why Thread.start() is needed? [duplicate]为什么需要 Thread.start()? [复制]
【发布时间】:2014-05-28 09:00:24
【问题描述】:

当我想到一个问题时,我正在研究线程。如果我们可以像任何普通方法一样直接使用类的对象调用 run() 方法,那么为什么我们需要调用 Thread.start() 来调用run() 方法..我尝试了如图所示的两种方法并得到了相同的结果

第一次尝试直接调用run()方法

class Abc extends Thread
{
   public void run()
   {
      for(int i=0;i<5;i++)
      {
         System.out.println("Abc");
      }
      try
      {
          Thread.sleep(100);
      }catch(Exception e)
      {
          System.out.println("Error : "+ e);
      }
   }
}

class Xyz extends Thread
{
    public void run()
    {
       try
       {
           for(int i=0;i<5;i++)
           {
               System.out.println("Xyz");
           }
           Thread.sleep(100);
       }catch(Exception e)
       {
            System.out.println("Error : "+ e);
       }
    }
}

public class ThreadDemo 
{
    public static void main(String[] args) 
    {
        Abc ob=new Abc();
        Xyz oc=new Xyz();
        ob.run();
        oc.run();
    }
}

通过调用 Thread.start() 进行第二次尝试

public class ThreadDemo 
{
    public static void main(String[] args) 
    {
        Abc ob=new Abc();
        Xyz oc=new Xyz();
        Thread t1,t2;
        t1=new Thread(ob);
        t2=new Thread(oc);
        t1.start();
        t2.start();
    }
}

【问题讨论】:

  • thread.start() 开始一个新的堆栈调用但是如果你尝试直接调用 run 那么它将在当前正在执行的调用堆栈下被调用,即 main 本身......

标签: java multithreading thread-sleep


【解决方案1】:

如果您直接调用run(),代码将在调用线程中执行。通过调用start(),一个新的线程被创建并并行执行。

【讨论】:

  • 这就是我要问的......如果工作是由调用线程完成的,为什么需要创建新线程
  • @gau123:你读过多线程的用途吗?
  • @gau123 这与后台的行为不同。如果你想要多线程,你需要创建一个新的线程并并行运行它。否则创建线程毫无意义。尝试使用睡眠数字,您会发现差异。
  • @liarspocker 我明白了..谢谢你的帮助 :)
【解决方案2】:

如果直接调用run(),那么所有的工作都会在主线程上完成。 通过使用 Thread.start,它将在主线程以外的新线程上执行;)

【讨论】:

    【解决方案3】:

    要观察有什么区别,请将您的睡眠通话时间增加到更长的时间,例如 10 秒。这将表明您需要Thread.start 以避免第一个任务等待第二个任务。

    如果你使用Thread.start,你会看到两个线程的输出立即出现。

    在你使用run的情况下,你会看到第一个的输出出现,然后是10秒的延迟,然后是第二个的输出。

    【讨论】:

    • +1 但您仍然需要解释它们之间的区别。没有提到单线程或多线程
    • 是的,但由于他在问题的任何地方都没有提到它,我们需要澄清整个事情,对吧?因为从他的问题来看,他似乎并不知道其中的区别
    【解决方案4】:

    如果您直接调用run() 方法,那么代码将内联运行。要在单独的线程中运行代码,需要调用Thread.start()。

    【讨论】:

      【解决方案5】:

      当您在线程引用上调用 start() 方法时,它会创建整个上下文区域。然后线程将在您调用的位置具有独立的堆栈。更多的是 start() 调用 OS 本机线程以在单独的内存上下文中启动它。

      虽然 run() 方法调用被认为是简单的方法调用,但您不会受益于并发,因为它的执行是当前堆栈。

      【讨论】:

      • 意思是你想说保持并发..我需要调用 start() 方法..对吗??
      • 是的,这是主要目的。
      猜你喜欢
      • 2020-08-22
      • 2014-11-13
      • 1970-01-01
      • 2013-07-09
      • 2021-02-23
      • 2013-04-21
      • 2012-03-16
      • 2016-08-02
      • 2021-10-04
      相关资源
      最近更新 更多