在上一篇 Java基礎之線程那些事 咱們介紹了關於線程和進程的相關概念,還留下了個題目:即三個窗口同時賣100張票的問題,那麼今天就來講說多線程編程的實現。java
構建多線程主要有繼承和實現兩種方法編程
繼承的方法即構建一個類繼承於Thread類,並實現run方法,具體以下安全
class SubThread extends Thread{
@Override
public void run() {
//具體須要完成的業務代碼
}
}
SubThread subThread=new SubThread();//建立實例
subThread.start();//線程啓動
複製代碼
實現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方法
複製代碼
幾個重要的步驟多線程
Thread.currentThread() //獲取當前線程
//如下都是線程實例上的方法
setName(); //設置線程名字
getName(); //獲取線程名字
yield();//顯示釋放cpu的執行權
join();//在一個線程執行中調用另外一個目標線程的join方法,意味着立馬執行目標線程,且執行完畢纔回到原線程
isAlive();//判斷當前線程是否還存活
sleep();//顯示的讓線程睡眠
setPriority() //設置當前線程的優先級
getPriority()//獲取當前線程的優先級
複製代碼
都與Runnable接口相關ide
業務目標代碼放在run方法裏post
鑑於java單繼的特性 實現接口都方式更具備通用性性能
若是多個線程操做同一份資源 更適合使用實現都方式ui
在上一篇中咱們留個問題:就是三個窗口賣票,票一共有100張,咱們來實現它spa
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 ,三個線程共享這個數據
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單繼承的缺點。
可是本文的樣例代碼並非線程安全的,關於線程安全問題,咱們下一篇講解。
喜歡本文的朋友們,歡迎長按下圖關注訂閱號"個人編程筆記",收看更多精彩內容~~