實現:
sychronized()
工作原理:
1)任意的物件都可以作為乙個鎖物件,每一物件都有乙個內建鎖
2) 某一時刻,鎖物件最多只能被乙個執行緒持有
3)執行緒獲得了鎖之後會一直持有,知道執行完同步**塊後才能釋放。
4) 執行緒要執行同步**塊,必須先獲得鎖物件
執行緒不安全舉例:
/**
* 執行緒安全問題
* 以下的做法會出現執行緒不安全的問題
* @author kiosk
*/public
class
ticket
extends
thread
trycatch
(interruptedexception e)
system.out.
println
(getname()
+"視窗賣出了第"
+ num--
+"號票");
}}}
解決的方法:讓他們有乙個共同的類的位元組碼的鎖物件
public
class
ticket
extends
thread
trycatch
(interruptedexception e)
system.out.
println
(getname()
+"視窗賣出了第"
+ num--
+"號票");
}}}}
sleep方法(會丟擲異常),讓執行緒休眠一會兒
/**
* @author kiosk
*/public
class
demo2
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+ i);}
}}.start()
;new
thread()
catch
(interruptedexception e)}}
}.start()
;}}
(1)sleep方法
根據原始碼發現,sleep是乙個本地方法,
原始碼:
守護執行緒:該執行緒不會單獨執行,當其他的非守護執行緒執行完畢之後,守護執行緒會自動退出。具有最低級別的優先順序,主要是為其他的優先順序高的執行緒進行服務。
方法:void setdaemon(boolean on) 當引數為true的時候,執行緒為守護執行緒
public
final
void
setdaemon
(boolean on)
// on為true時候,就將這個執行緒標誌為守護執行緒
daemon = on;
}
舉例:
public
class
deamon}}
; thread t2 =
newthread
("這是乙個守護執行緒")}
};//將執行緒設定為守護執行緒,當非守護執行緒執行完畢的時候,守護執行緒就會退出
t2.setdaemon
(false);
t1.start()
; t2.
start()
;}}
相當於是插隊 join() 方法,會丟擲異常(interruptedexception)
舉例:兩個執行緒中,在乙個執行緒執行的過程中另乙個執行緒加入,先讓加入的執行緒執行完畢,相當於是搶占資源。
源**:
//用來加入當前執行緒(規定的時間)
public
final
synchronized
void
join
(long millis)
throws interruptedexception
//如果引數為零的話,一直等待
if(millis ==0)
}else
//進入wait狀態
wait
(delay)
;//now為從記錄base開始之後過去的時間
now = system.
currenttimemillis()
- base;}}
}
舉例:
public
class
testjoin
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"1111");
}}};
thread t2 =
newthread
("執行緒2"
)catch
(interruptedexception e)
if(i ==2)
catch
(interruptedexception e)
} system.out.
println
(thread.
currentthread()
.getname()
+"2222");
}}};
t1.start()
; t2.
start()
;}}
禮讓執行緒(很少使用)讓出cpu
public
class
testyied}}
.start()
;new
thread
("禮讓執行緒"
) system.out.
println
(thread.
currentthread()
.getname()
+"--"
+ i );}
}}.start()
;}}
public final void setpriority(int newpriority)
public
class
testpriority}}
; thread t2 =
newthread()
}};//設定最大優先順序 能讓當前執行緒優先執行
t1.setpriority(10
);//設定最小優先順序
t2.setpriority(1
);t1.
start()
; t2.
start()
;}}
vector:執行緒安全 arraylist :執行緒不安全的
hashmap :執行緒安全 hashtable :執行緒安全
stringbuffer:執行緒安全 stringbuilder:執行緒不安全
collections:集合工具類能將執行緒不安全的集合轉換為執行緒安全的集合
JAVA執行緒總結( 二)
繼續上篇的總結,這次我們講執行緒同步機制 執行緒同步是為了確保執行緒安全,所謂執行緒安全指的是多個執行緒對同一資源進行訪問時,有可能產生資料不一致問題,導致執行緒訪問的資源並不是安全的。如果多執行緒程式執行結果和單執行緒執行的結果是一樣的,且相關變數的值與預期值一樣,則是執行緒安全的。舉個簡單的例子...
Java執行緒總結
在實際應用中,我們經常用到多執行緒,如車站的售票系統,車站的各個售票口相當於各個執行緒。當我們做這個系統的時候可能會想到兩種方式來實現,繼承thread類或實現runnable介面,現在看一下這兩種方式實現的兩種結果。繼承thread方式class threadtest extends thread...
Java執行緒(二)
昨天我們認識了什麼是執行緒和實現他的兩種方式,今天我們再進一步了解。執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。如下圖 上圖能夠清晰的看出執行緒見得狀態是如何轉換的,並且標註了在不同的狀態執行緒對cpu的資源使用情況。其中對執行緒操作的方...