回顧
在上一篇 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單繼承的缺點。
但是本文的樣例程式碼並不是執行緒安全的,關於執行緒安全問題,我們下一篇講解。
喜歡本文的朋友們,歡迎長按下圖關注訂閱號"我的程式設計筆記",收看更多精彩內容~~