歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

理解Java多線程

1.線程的創建

之前知道Java中一個多線程的創建方法是繼承Thread類或者實現Runable接口,但是看不懂下面這種創建線程的方法

第一種

new Thread(new Runnable() { 
            @Override 
            public void run() { 
             
                } 
            } 
        }).start();//這種方式中new Thread()是創建了一個線程,而new Runable()對象中是線程想要執行的代碼,這樣把想要執行的代碼放到一個創建的對象中,所以很好的體現了面向對象的編程規則。 

或者下面這種創建格式

第二種

new Thread(){ 
        @Override 
        public void run() { 
            // TODO Auto-generated method stub 
            super.run(); 
        } 
    }.start(); 

其實兩種方法昨天看了一段是視頻現在理解了,其實第一種方法就是面向對象的思維模式去創建一個線程,在Thread的源碼中,一種是通過構造方法傳遞一個Runable對象然後為target賦值,然後去實現一個線程的創建,也就是上面的第一種創建方法,一種是直接重寫run方法,也就是上面的第二種方法創建線程,但是網上通常是使用第一種方法的比較多?那是為什麼呢?是因為第一種通過構造方法的方式創建線程更能體現面向的規則,new Thread()是創建了一個對象,這個對象想要執行的代碼就寫在了括號裡面,這樣就很好的體現了面向對象的編程方式。

那我們想一下,下面這種創建對象的方式是會執行Runable中的run方法還是執行thread的run方法呢?

new Thread( 
                new  Runnable() { 
                    public void run() { 
                        while (true) { 
                            try { 
                                Thread.sleep(500); 
                            } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                            } 
                            System.out.println("runable" + Thread.currentThread().getName()); 
                        } 
                    } 
                } 
        ) { 
            @Override 
            public void run() { 
                while (true) { 
                    try { 
                        Thread.sleep(500); 
                    } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                    } 
                    System.out.println("thread" + Thread.currentThread().getName()); 
                } 
            } 
        }.start(); 

new Thread(new Runable(){}){}.start();答案是執行thread中的run方法(即是子類中的run方法),為什麼呢?因為創建一個new thread的時候重寫了父類中的run()方法,那麼就會直接執行thread中的run方法了,如果這個子類中的run方法不存在的情況下才會去執行父類中的run方法。

Copyright © Linux教程網 All Rights Reserved