Runable和thread的區別(多執行緒必須用Runable)
阿新 • • 發佈:2019-01-01
看到一個面試題.問兩種實現多執行緒的方法.沒事去網上找了找答案.
網上流傳很廣的是一個網上售票系統講解.轉發過來.已經不知道原文到底是出自哪裡了.
Java中有兩種實現多執行緒的方式。一是直接繼承Thread類,二是實現Runnable介面。那麼這兩種實現多執行緒的方式在應用上有什麼區別呢?
為了回答這個問題,我們可以通過編寫一段程式碼來進行分析。我們用程式碼來模擬鐵路售票系統,實現通過四個售票點發售某日某次列車的100張車票,一個售票點用一個執行緒表示。
我們首先這樣編寫這個程式:
Java程式碼
main測試類:
Java程式碼
上面的程式碼中,我們用ThreadTest類模擬售票處的售票過程,run方法中的每一次迴圈都將總票數減1,模擬賣出一張車票,同時該車票號打印出來,直接剩餘的票數到零為止。在ThreadDemo1類的main方法中,我們建立了一個執行緒物件,並重復啟動四次,希望通過這種方式產生四個執行緒。從執行的結果來看我們發現其實只有一個執行緒在執行,這個結果告訴我們:一個執行緒物件只能啟動一個執行緒,無論你呼叫多少遍start()方法,結果只有一個執行緒。
我們接著修改ThreadDemo1,在main方法中建立四個Thread物件:
Java程式碼
這下達到目的了嗎?
從結果上看每個票號都被列印了四次,即四個執行緒各自賣各自的100張票,而不去賣共同的100張票。這種情況是怎麼造成的呢?我們需要的是,多個執行緒去處理同一個資源,一個資源只能對應一個物件,在上面的程式中,我們建立了四個ThreadTest物件,就等於建立了四個資源,每個資源都有100張票,每個執行緒都在獨自處理各自的資源。
經過這些實驗和分析,可以總結出,要實現這個鐵路售票程式,我們只能建立一個資源物件,但要建立多個執行緒去處理同一個資源物件,並且每個執行緒上所執行的是相同的程式程式碼。在回顧一下使用介面編寫多執行緒的過程。
Java程式碼
Java程式碼
上面的程式中,建立了四個執行緒,每個執行緒呼叫的是同一個ThreadTest物件中的run()方法,訪問的是同一個物件中的變數(tickets)的例項,這個程式滿足了我們的需求。在Windows上可以啟動多個記事本程式一樣
網上流傳很廣的是一個網上售票系統講解.轉發過來.已經不知道原文到底是出自哪裡了.
Java中有兩種實現多執行緒的方式。一是直接繼承Thread類,二是實現Runnable介面。那麼這兩種實現多執行緒的方式在應用上有什麼區別呢?
為了回答這個問題,我們可以通過編寫一段程式碼來進行分析。我們用程式碼來模擬鐵路售票系統,實現通過四個售票點發售某日某次列車的100張車票,一個售票點用一個執行緒表示。
我們首先這樣編寫這個程式:
Java程式碼
- class ThreadTest extends Thread{
-
privateint ticket =
- publicvoid run(){
- while(true){
- if(ticket > 0){
- System.out.println(Thread.currentThread().getName() +
- "is saling ticket" + ticket--);
- }else{
- break;
- }
- }
- }
- }
main測試類:
Java程式碼
- publicclass ThreadDome1{
-
publicstaticvoid
- ThreadTest t = new ThreadTest();
- t.start();
- t.start();
- t.start();
- t.start();
- }
- }
上面的程式碼中,我們用ThreadTest類模擬售票處的售票過程,run方法中的每一次迴圈都將總票數減1,模擬賣出一張車票,同時該車票號打印出來,直接剩餘的票數到零為止。在ThreadDemo1類的main方法中,我們建立了一個執行緒物件,並重復啟動四次,希望通過這種方式產生四個執行緒。從執行的結果來看我們發現其實只有一個執行緒在執行,這個結果告訴我們:一個執行緒物件只能啟動一個執行緒,無論你呼叫多少遍start()方法,結果只有一個執行緒。
我們接著修改ThreadDemo1,在main方法中建立四個Thread物件:
Java程式碼
- publicclass ThreadDemo1{
- publicstaticvoid main(String[] args){
- new ThreadTest().start();
- new ThreadTest().start();
- new ThreadTest().start();
- new ThreadTest().start();
- }
-
}
- class ThreadTest extends Thread{
- privateint ticket = 100;
- publicvoid run(){
- while(true){
- if(ticket > 0){
- System.out.println(Thread.currentThread().getName() +
- " is saling ticket" + ticket--);
- }else{
- break;
- }
- }
- }
-
}
這下達到目的了嗎?
從結果上看每個票號都被列印了四次,即四個執行緒各自賣各自的100張票,而不去賣共同的100張票。這種情況是怎麼造成的呢?我們需要的是,多個執行緒去處理同一個資源,一個資源只能對應一個物件,在上面的程式中,我們建立了四個ThreadTest物件,就等於建立了四個資源,每個資源都有100張票,每個執行緒都在獨自處理各自的資源。
經過這些實驗和分析,可以總結出,要實現這個鐵路售票程式,我們只能建立一個資源物件,但要建立多個執行緒去處理同一個資源物件,並且每個執行緒上所執行的是相同的程式程式碼。在回顧一下使用介面編寫多執行緒的過程。
Java程式碼
- publicclass ThreadDemo1{
- publicstaticvoid main(String[] args){
- ThreadTest t = new ThreadTest();
- new Thread(t).start();
- new Thread(t).start();
- new Thread(t).start();
- new Thread(t).start();
- }
- }
Java程式碼
- class ThreadTest implements Runnable{
- privateint tickets = 100;
- publicvoid run(){
- while(true){
- if(tickets > 0){
- System.out.println(Thread.currentThread().getName() +
- " is saling ticket " + tickets--);
- }
- }
- }
- }
上面的程式中,建立了四個執行緒,每個執行緒呼叫的是同一個ThreadTest物件中的run()方法,訪問的是同一個物件中的變數(tickets)的例項,這個程式滿足了我們的需求。在Windows上可以啟動多個記事本程式一樣