Java基礎之多線程編程

回顧

在上一篇 Java基礎之線程那些事 咱們介紹了關於線程和進程的相關概念,還留下了個題目:即三個窗口同時賣100張票的問題,那麼今天就來講說多線程編程的實現。java

構建多線程主要有繼承和實現兩種方法編程

多線程建立

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接口bash

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接口相關ide

業務目標代碼放在run方法裏post

鑑於java單繼的特性 實現接口都方式更具備通用性性能

若是多個線程操做同一份資源 更適合使用實現都方式ui

賣票程序

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

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單繼承的缺點。

可是本文的樣例代碼並非線程安全的,關於線程安全問題,咱們下一篇講解。

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

相關文章
相關標籤/搜索