1. 程式人生 > >Java第十三天學習筆記~多執行緒(執行緒的狀態、建立執行緒的第二種方式、同步程式碼塊、同步函式)

Java第十三天學習筆記~多執行緒(執行緒的狀態、建立執行緒的第二種方式、同步程式碼塊、同步函式)

                                 多執行緒

執行緒的狀態

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();
	}
}
  1. 定義類實現Runnable介面
  2. 覆蓋介面中的run方法,將執行緒的任務程式碼封裝到run方法中
  3. 通過Thread類建立執行緒物件並將Runnable介面的子類物件作為Thread類的建構函式的引數進行傳遞,為什麼?-------因為執行緒中的任務都封裝在Runnable介面子類物件run方法中,所以要線上程物件建立時就必須名曲要執行的任務
  4. 呼叫執行緒物件的start的方法開啟執行緒

實現Runnable介面的好處:

  1. 將執行緒的任務從執行緒的子類中分離出來,進行了單獨的封裝,按照面向物件的思想將任務封裝成了物件
  2. 避免了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();
	}
}

同步程式碼塊

執行緒安全為題產生的原因:

  1. 多個執行緒在操作共享的資料
  2. 操作的共享資料的執行緒程式碼有多條

當一個執行緒在執行操作共享資料的多條程式碼過程中,其他執行緒參與了運算,就會導致執行緒安全產生問題

可以用同步程式碼快來解決這個問題

格式: 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;  
    }  
}  

死鎖:同步的巢狀