Java基礎之多執行緒程式設計

麥克斯維發表於2019-01-14

回顧

在上一篇 Java基礎之執行緒那些事 我們介紹了關於執行緒和程式的相關概念,還留下了個題目:即三個視窗同時賣100張票的問題,那麼今天就來說說多執行緒程式設計的實現。

構建多執行緒主要有繼承和實現兩種方法

多執行緒建立

1.繼承Thread類

繼承的方法即構建一個類繼承於Thread類,並實現run方法,具體如下

class SubThread extends  Thread{
    @Override
    public void run() {
       //具體需要完成的業務程式碼
    }
}
SubThread subThread=new SubThread();//建立例項
subThread.start();//執行緒啟動
複製程式碼
  • start方法啟動執行緒並執行對應的run方法
  • 需要將需要實現的業務程式碼放在run方法內

2.實現Runnable介面

實現java.lang.Runnable介面

class SubThread implements Runnable{//建立一個實現Runnable介面的類
    @Override
    public void run() {//實現run方法
     //你的業務程式碼
    }
}
SubThread subThread1=new SubThread();//建立一個例項
Thread t1=new Thread(subThread1);//把例項當引數傳遞給Thread構造方法 //得到一個執行緒例項
t1.start();//呼叫執行緒例項的start方法
複製程式碼

幾個重要的步驟

  • 1 構建一個類實現Runnable介面
  • 2 重寫run方法 run裡寫你的業務程式碼
  • 3 構建這個類例項並當引數傳遞到Thread類構造方法中得到執行緒例項
  • 4 執行緒例項呼叫start方法

3.Thred類的一些基礎方法

Thread.currentThread() //獲取當前執行緒
//以下都是執行緒例項上的方法
setName(); //設定執行緒名字
getName(); //獲取執行緒名字
yield();//顯示釋放cpu的執行權  
join();//在一個執行緒執行中呼叫另一個目標執行緒的join方法,意味著立馬執行目標執行緒,且執行完畢才回到原執行緒
isAlive();//判斷當前執行緒是否還存活
sleep();//顯示的讓執行緒睡眠
setPriority() //設定當前執行緒的優先順序
getPriority()//獲取當前執行緒的優先順序
複製程式碼

4.對比繼承與實現

都與Runnable介面相關

業務目的碼放在run方法裡

鑑於java單繼的特性 實現介面都方式更具有通用性

如果多個執行緒操作同一份資源 更適合使用實現都方式

賣票程式

在上一篇中我們留個問題:就是三個視窗賣票,票一共有100張,我們來實現它

1.繼承的方法

class Window extends  Thread{//繼承
    static int ticket=100;
    @Override
    public void run() {
        while (true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"售票:票號為:"+ ticket--);
            }else{
                break;
            }
        }
    }
}
//建立三個執行緒例項
Window w1=new Window();
Window w2=new Window();
Window w3=new Window();
w1.setName("視窗1");
w2.setName("視窗2");
w3.setName("視窗3");
w1.start();
w2.start();
w3.start();
複製程式碼

由於是一共賣100張票,故需要設ticket 為static ,三個執行緒共享這個資料

2.實現的方法

class Window implements Runnable{//實現介面
    int ticket=100;
    @Override
    public void run() {
        while (true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"售票:票號為:"+ ticket--);
            }else{
                break;
            }
        }
    }
}

//構建三個執行緒例項
Window w=new Window();
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName("視窗1");
t2.setName("視窗2");
t3.setName("視窗3");
t1.start();
t2.start();
t3.start();
複製程式碼

注:由於這裡只有一個Window例項 所有隻有一份ticket=100,不需要static修飾

多執行緒程式的優缺點

在單核的時代,多執行緒會帶來執行緒切換的損耗,但是即使是這樣多執行緒對圖形化介面更有意義,它可增強使用者體驗。(例如你在單核機器上邊寫程式碼 邊聽歌) 實際上多個執行緒在cpu上來回切換,給你一種並行的假象。

在多核心時代,例如當前的8代i7處理器,已經是6核12執行緒了,可以保持多個執行緒並行運算,極大的提高效能,用多執行緒程式設計 反而能提高計算機cpu的利用率

另外多執行緒程式設計能改善程式結構,可將長又複雜的程式分割成多個執行緒,獨立執行,利於理解和修改

總結

今天主要講解如何實現多執行緒,以及執行緒例項上有哪些方法,需要重點掌握實現的方式,因為實現的方式避開了java單繼承的缺點。

但是本文的樣例程式碼並不是執行緒安全的,關於執行緒安全問題,我們下一篇講解。

喜歡本文的朋友們,歡迎長按下圖關注訂閱號"我的程式設計筆記",收看更多精彩內容~~

Java基礎之多執行緒程式設計

相關文章