当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java Thread.start()和Thread.run()的区别用法及代码示例


在Java的多线程概念中,start()和run()是两个最重要的方法。下面是Thread.start()和Thread.run()方法之间的一些区别:

  1. 新线程创建:当程序调用start()方法时,将创建一个新线程,然后执行run()方法。但是,如果我们直接调用run()方法,则不会创建新线程,并且run()方法将作为对当前调用线程本身的常规方法调用执行,并且不会发生多线程。让我们通过一个例子来理解它:
    class MyThread extends Thread { 
        public void run() 
        { 
            System.out.println("Current thread name:"
                               + Thread.currentThread().getName()); 
            System.out.println("run() method called"); 
        } 
    } 
      
    class GeeksforGeeks { 
        public static void main(String[] args) 
        { 
            MyThread t = new MyThread(); 
            t.start(); 
        } 
    }
    输出:
    Current thread name:Thread-0
    run() method called
    

    从上面的示例中可以看到,当我们调用线程类实例的start()方法时,将使用默认名称Thread-0创建一个新线程,然后调用run()方法,并且其中的所有内容都在新创建的线程上执行。现在,让我们尝试直接调用run()方法,而不是start()方法:

    class MyThread extends Thread { 
        public void run() 
        { 
            System.out.println("Current thread name:"
                               + Thread.currentThread().getName()); 
      
            System.out.println("run() method called"); 
        } 
    } 
      
    class GeeksforGeeks { 
        public static void main(String[] args) 
        { 
            MyThread t = new MyThread(); 
            t.run(); 
        } 
    }
    输出:
    Current thread name:main
    run() method called
    

    从上面的示例中可以看到,当我们调用MyThread类的run()方法时,不会创建任何新线程,并且run()方法将在当前线程(即主线程)上执行。因此,没有发生多线程。 run()方法被称为常规函数调用。

  2. 多次调用:在Java的多线程概念中,start()方法和run()方法之间的另一个最重要的区别是,我们不能两次调用start()方法,否则它将引发IllegalStateException,而run()方法可以多次调用,因为它只是一种常规方法。让我们通过一个例子来理解它:
    class MyThread extends Thread { 
        public void run() 
        { 
            System.out.println("Current thread name:"
                               + Thread.currentThread().getName()); 
      
            System.out.println("run() method called"); 
        } 
    } 
      
    class GeeksforGeeks { 
        public static void main(String[] args) 
        { 
            MyThread t = new MyThread(); 
            t.start(); 
            t.start(); 
        } 
    }

    输出

    Current thread name:Thread-0
    run() method called
    Exception in thread "main" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:708)
        at GeeksforGeeks.main(File.java:11)
    

    如上例所示,再次调用start()方法将引发java.lang.IllegalThreadStateException。现在,让我们尝试两次调用run()方法:

    class MyThread extends Thread { 
        public void run() 
        { 
            System.out.println("Current thread name:"
                               + Thread.currentThread().getName()); 
            System.out.println("run() method called"); 
        } 
    } 
      
    class GeeksforGeeks { 
        public static void main(String[] args) 
        { 
            MyThread t = new MyThread(); 
            t.run(); 
            t.run(); 
        } 
    }
    输出:
    Current thread name:main
    run() method called
    Current thread name:main
    run() method called
    

    如上例所示,两次调用run()方法不会引发任何异常,它会按预期执行两次,但在主线程本身上执行。

    摘要
    start() run()
    创建一个新线程,并在新创建的线程上执行run()方法。 没有创建新线程,并且在调用线程本身上执行了run()方法。
    不能被多次调用,否则抛出java.lang.IllegalStateException 可以多次调用
    在java.lang.Thread类中定义。 在java.lang.Runnable接口中定义,必须在实现类中重写。


相关用法


注:本文由纯净天空筛选整理自raman_257大神的英文原创作品 Difference between Thread.start() and Thread.run() in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。