多執行緒基礎 Java併發1
阿新 • • 發佈:2019-01-01
目錄
執行緒和程序概念
程序
是獨立的應用程式,程序中一般會有多個執行緒,程序是執行緒的集合。執行緒
就是一條執行路徑。多執行緒
目的為了提高程式效率。
同步和非同步概念
同步
:程式碼從上往下進行執行。非同步
多執行緒建立方式
繼承Thread類(不推薦)
class ThreadDemo1 extends Tread{
@Override
public run(){
while(true){
System.out.println("TreadDemo1");
}
}
}
/**
*執行
*/
TreadDemo1 t = new TreadDemo1();
t.start();
實現runnable介面,重寫run方法
class ThreadDemo2 implements Runnable{ public void run(){ while(true){ System.out.println("ThreadDemo2"); } } } /** *執行 */ Thread t = new Thread(new ThreadDemo2()); t.start();
使用匿名內部類
Thread t = new Thread(new Runnable(){
public void run(){
while(ture){
System.out.println("ThreadDemo3");
}
}
})
/*
*執行
*/
t.start();
多執行緒的執行狀態
新建狀態
:建立好執行緒,沒有呼叫start方法之前。就緒狀態
:等待cpu分配執行權。執行狀態
:執行run方法程式碼。死亡狀態
:run方法執行完畢後,一個未捕獲異常終止了run方法使執行緒猝死。阻塞狀態
:wait、sleep方法,鎖資源被其他執行緒搶斷等。
守護執行緒、非守護執行緒
使用者執行緒
:使用者自己建立的執行緒,如果主執行緒停止掉,不會影響使用者執行緒。也叫非守護執行緒
。守護執行緒
:和主執行緒一起銷燬。例如gc執行緒。
Thread t = new Thread(newThreadDemo());//此時t為使用者執行緒
t.setDaemon(true);//將執行緒t變為守護執行緒
t.start;//執行
join方法()
作用
:讓其他執行緒變為等待。把指定的執行緒加入當前執行緒,可以讓兩個交替執行的執行緒合併為順序執行的執行緒。比如執行緒B呼叫了執行緒A的join()方法,直到執行緒A執行完畢後,才會執行執行緒B。例子
:
/**
*示例:子執行緒執行完畢後,主執行緒才能執行
*/
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
});
t1.start();
// 當在主執行緒當中執行到t1.join()方法時,就認為主執行緒應該把執行權讓給t1
t1.join();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("main" + "i:" + i);
}
優先順序
- 現代作業系統基本採用時分的形式排程執行的執行緒,執行緒分配得到的時間片的多少決定了執行緒使用處理器資源的多少,也對應了執行緒優先順序這個概念。在JAVA執行緒中,通過一個int priority來控制優先順序,範圍為1-10,其中10最高,預設值為5。
例子
:
Thread t = new Thread(new ThreadDemo());//建立執行緒t
t.setPriority(10);//將執行緒優先順序設為10
t.start();//執行執行緒
執行緒安全
原因
:當多個執行緒共享同一個全域性變數,在寫的操作時,可能會受到其他執行緒的干擾。解決方法
:
- 內建鎖(Synchronized):保證執行緒原子性,當執行緒進入方法時,自動獲取鎖,一旦鎖被其他執行緒獲取到後,其他的執行緒就會等待,只有一個執行緒進行使用。程式執行完畢後就會把鎖釋放。但是它會降低程式的執行效率(鎖資源的競爭)。
- 顯示鎖(Lock鎖)
同步方式
同步程式碼塊:
/**
*同步程式碼塊示例
*object為任意全域性物件
*/
synchronized(object){//需要保證同步的不同執行緒object一致
//同步的程式碼
}
- 非靜態同步程式碼塊使用this鎖。
- 靜態同步程式碼塊使用當前類的class位元組碼檔案鎖。
同步方法
- 用synchronized關鍵字修飾方法。
/**
*同步方法示例
*object為任意全域性物件
*/
public synchronized run{//同步方法
//同步的程式碼
}
注意
- 在一個程序中,一定會有主執行緒。
- 執行緒執行是呼叫start方法而不是run方法。