當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。