Java第十三天學習筆記~多執行緒(執行緒的狀態、建立執行緒的第二種方式、同步程式碼塊、同步函式)
阿新 • • 發佈:2018-12-27
多執行緒
執行緒的狀態
CPU的執行資格:可以被CPU處理,在處理佇列排隊
CPU的執行權:正在被CPU處理
建立執行緒的第二種方式
class Demo implements Runnable { public void run() { show(); } public void show() { for(int x=0;x<20;x++) { System.out.println(Thread.currentThread().getName()+"........"+x); } } } class ThreadDemo { public static void main(String[] args) { Demo d=new Demo(); Thread t1=new Thread(d); Thread t2=new Thread(d); t1.start(); t2.start(); } }
- 定義類實現Runnable介面
- 覆蓋介面中的run方法,將執行緒的任務程式碼封裝到run方法中
- 通過Thread類建立執行緒物件並將Runnable介面的子類物件作為Thread類的建構函式的引數進行傳遞,為什麼?-------因為執行緒中的任務都封裝在Runnable介面子類物件run方法中,所以要線上程物件建立時就必須名曲要執行的任務
- 呼叫執行緒物件的start的方法開啟執行緒
實現Runnable介面的好處:
- 將執行緒的任務從執行緒的子類中分離出來,進行了單獨的封裝,按照面向物件的思想將任務封裝成了物件
- 避免了Java單繼承的侷限性
所以,建立執行緒的第二種方法較為常用
class Ticket implements Runnable //extends Thread { private int num=100; public void run() { while(true) { if(num>0) { System.out.println(Thread.currentThread().getName()+".....sale...."+num--); } } } } class TicketDemo { public static void main(String[] args) { Ticket t= new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); Thread t4=new Thread(t); /* Ticket t1=new Ticket(); Ticket t2=new Ticket(); Ticket t3=new Ticket(); Ticket t4=new Ticket(); */ t1.start(); t2.start(); t3.start(); t4.start(); } }
同步程式碼塊
執行緒安全為題產生的原因:
- 多個執行緒在操作共享的資料
- 操作的共享資料的執行緒程式碼有多條
當一個執行緒在執行操作共享資料的多條程式碼過程中,其他執行緒參與了運算,就會導致執行緒安全產生問題
可以用同步程式碼快來解決這個問題
格式: synchronize(物件) { 需要被同步的程式碼;}
同步的好處:解決了執行緒安全的問題
同步的弊端:相對降低了效率,因為同步外的執行緒都會判斷同步鎖
同步的前提:必須有多個執行緒並使用同一個鎖
同步函式
public synchronize void add(int num){ }
同步函式的鎖是this
同步函式的同步程式碼塊的區別:
同步函式的鎖是固定的this
同步程式碼塊的鎖是任意物件
建議使用同步程式碼塊
靜態的同步函式使用的鎖是該函式所屬位元組碼檔案物件,可以用get.class方法獲取,也可以用當前類名.class表示
public static Single getInstance()
{
Synchronized(Single.class){}
}
/*
加同步的單例設計模式————懶漢式
*/
class Single
{
private static Single s = null;
private Single(){}
public static void getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}