進程:是指在系統中正在運行的一個運用程序實例,它包括代碼加載,執行和執行完畢一個完整的過程,也是進程本身從產生發展到消亡的過程。
線程:是比進程更小的執行單位,是在進程的基礎上進行的進一步的化分,多線程是指一個進程在執行的過程中可以產生多個同時存在,同時運行的線程。
多線程的優點:多線程機制可以合理的利用資源,提高程序的運行效率(解決程序多部分同時運行的問題)。一個進程至少包含一個線程,程序運行時即自動產生一個線程。
多線程的弊端:線程太多會導致整體效率降低
創建線程方式一:繼承Thread類
可以通過Thread類的getName方法獲取線程的名稱,Thread-編號(從零開始)
public class Test extends Thread {
PRivate String name;
public Test(String name)
{
this.name=name;
}
public void run()//運行線程
{
for(int i=1;i<=15;i++)
{
System.out.println(name+"運行,i="+i);
}
}
public static void main(String [] args)
{
Test a= new Test("線程A");//創建一個線程對像
a.start();//開啟運行線程
Test b= new Test("線程B");
b.start();
}
}
創建線程的第二種方式:實現Runnable接口
1. 定義類實現Runnable接口
例如:
public class Test implements Runnable{
private String name;
public Test(String name)
{
this.name=name;
}
public void run()
{
for(int i=1;i<=15;i++)
{
System.out.println(name+"運行,i="+i);
}
}
public static void main(String [] args)
{
Test a= new Test("線程A");
Test b=new Test("線程B");
Thread a1=new Thread(a);
Thread b1=new Thread(b);
a1.start();
b1.start();
}
}
實現Runnable接口的好處:
1. 將線程的任務從線程的子類中分離出來,進行了單獨的封裝。按照面向對象的思想將任務封裝成了對象。
所以創建線程的第二種方式比較常用。
線程安全問題產生的原因:
當一個線程在執行操作共享數據的多條代碼的過程中其他線程參與了運算就會導致線程安全問題。
在java中用同步代碼塊可以解決線程安全問題
同步代碼塊的格式:
synchronized(同步對象)
{
需要被同步的代碼。
}
同步對象是指為對象加上資源鎖,即一定時間范圍內只允許一個線程使用當前的同步對象,其他線程必須等待當前線程使用結束后才能使用該對象,通常情況下將當前的this對象或Object對象。
同步的好處:解決了線程的安全的問題。
同步的弊端:相對降低了效率因為同步外的線程都會判斷同步鎖(判斷同步對象)
同步的前提:同步中必須有多個線程并使用同一個同步對象。
也可以使用同步方法來解決線程安全問題:同步方法是指使用了synchronized關鍵字聲明方法,即為方法加上資源訪問鎖同一時間只允許一個線程調用此同步方法,其他線程必須等待當前線程調用結束后才能調用此同步方法。
同步方法和同步代碼塊的區別: 同步函數的鎖是this
同步代碼塊的鎖是任意對象
首選同步代碼塊。
注意:靜態同步函數使用的鎖是該函數所屬的字節碼文件的對象,可以用getClass()方法獲取,也可以使用類名.class來表示
死鎖:死鎖的常見情景之一同步的嵌套
多線程的等待喚醒機制:
方法:
wait(); 讓線程處于凍結狀態,被wait的線程會被存儲到線程池中
notify();喚醒線程池中的一個線程
notifyAll(); 喚醒線程池中的所有線程
這些方法都必須定義在同步中,因為這些方法都是用于操作線程狀態的方法,必須明確到底要操作的是哪個鎖上的線程。
jdk1.5以后將同步和鎖封裝成了對象,并將操作鎖的隱式方式定義到了該對象中,將隱式動作變成了顯示動作。
Lock接口:的出現替代了同步代碼塊或同步函數,將同步的隱式鎖變成現實鎖操作,同時更為靈活, 在一組鎖上添加多組監視器
lock();獲取鎖
unlock();釋放鎖,同時需要放到finally代碼塊中
Condition接口:的出現替代了Object中的wait notify notifyAll方法將這些監視器方法單獨進行了封裝,變成了Condition監視器對象,可以和任意鎖進行組合
await(); 等同于wait();
signal();等同于notify();
signalAll();等同于notifyAll();
wait();和sleep();的區別?
新聞熱點
疑難解答