關於java程式碼打包成jar在控制檯執行變慢的問題
建立執行緒有兩種方式,一種是繼承Thread類,一種是實現Rubavle介面
建立執行緒方式二
採用Java.lang.Runnable也是非常常見的一種,我們只需要重寫run方法即可。
步驟如下:
1.定義Runnable介面的實現類,並重寫該介面的run方法,該run方法的方法體同樣是該執行緒的執行緒執行體。
2.建立Runnable介面實現類的例項,並以此例項作為Thread類的target來建立Thread類的物件,該Thread類的物件才是真正的執行緒物件
3.呼叫執行緒物件的start()方法來啟動新執行緒
程式碼如下:
通過實現Runnable介面,使得該類有了多執行緒類的特徵,run方法是多執行緒程式的一個執行目標,所有的多執行緒程式碼都寫在run方法中,Thread類實際上也是實現了Runnable介面的類
在啟動多執行緒的時候,需要先通過Thread類的構造方法Thread(Runnable target)構建執行緒物件,然後呼叫Thread類物件的start方法來執行多執行緒程式
備註:Runnable物件僅僅作為Thread類物件target,Runnable實現類裡包含了run方法作為執行緒的執行體。而實際的執行緒物件依然是Thread類的例項
Thread類和Runnable介面的區別
如果一個類繼承了Thread類,則不適合資源的共享,但是如果實現了Runnable介面的話,則很容易實現資源共享。
實現Runnable介面比繼承Thread類的所具有的優勢:
1.適合多個相同的程式程式碼的執行緒去共享同一個資源
2.可以避免java中單繼承的侷限性
3.增加了程式的健壯性,實現解耦操作,程式碼可以被多個執行緒共享,程式碼和執行緒可以實現分離
4.執行緒池只能放入實現Runnable或者Callable類的執行緒,不能直接放入繼承Thread的類。
備註:在java中,每次程式執行至少啟動2個執行緒,一個是main執行緒,一個垃圾收集執行緒,因為每當使用java命令去執行一個類的時候,實際上都會啟動一個JVM,每一個JVM其實都是在作業系統中啟動一個程序
匿名內部類方式實現多執行緒程式的建立
使用執行緒的匿名內部類的方式,可以很方便的實現每個執行緒執行不同的執行緒任務操作。
使用匿名內部類方式實現Runnable介面的run方法
例項程式碼:
new Thread(new Runnable() {
//重寫run方法
@Override
public void run() {
for(int i=0;i<20;i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}).start();
執行緒安全
如果有多個執行緒在同時的執行,而這些執行緒可能同時在執行這段程式碼,程式每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的值是一樣的,就是執行緒安全的
通過葫蘆娃大戰奧特曼的案例發現,當u東哥執行緒去共享同一個資源的時候出現了執行緒的不安全問題
1.相同的票數,被賣了多次
2.不存在的票,也被賣出去了,比如說0和-1
這種問題,幾個視窗(執行緒)票數不同步,這種問題我們稱為執行緒不安全
備註:執行緒安全問題一般都是由全域性變數或者是靜態變數引起的,若每個執行緒中對全域性變數,靜態變數只有讀操作而無寫操作,這樣的話,一般來說這個全域性變數是執行緒安全的,若有多個執行緒同時執行寫操作一般都需要考慮執行緒的同步,否則的話就很可能會引發執行緒的安全問題。
執行緒的同步
當我們使用多執行緒訪問同一資源的時候,且這多個執行緒中對資源有寫的操作,就容易出現執行緒安全問題要解決多執行緒併發訪問一個資源的安全問題java中提供了同步機制(synchronized)來解決
視窗1執行緒進入操作的時候,視窗2和視窗3執行緒只能在外面等著,當視窗1執行緒操作結束,視窗1和視窗2和視窗3才有機會進入程式碼中去執行,也就是說某個執行緒修改共享資源的時候,其他執行緒不能修改共享資源,等待修改完畢同步後,才能去搶奪CPU的使用資源,完成對應的操作,保證了資料的同步性,解決了執行緒不安全的問題。
有三種方式實現同步機制:
1.同步程式碼塊
2.同步方法
3.鎖機制
同步程式碼塊
同步程式碼塊:synchronized關鍵字可以用於方法中的某個區塊(程式碼塊)中,表示只對這個程式碼塊的資源實行互斥訪問
格式:
synchronized(同步鎖){
//需要同步操作的同步程式碼
}
同步鎖
同步鎖是一個物件,是一個抽象的概念,可以想象成在物件上標記了一個鎖。
1.鎖物件可以是任意型別的
2.多個執行緒物件,要使用同一把鎖
注意:在任何時候,最多允許一個執行緒擁有同步鎖,誰拿到同步鎖誰就擁有資格進入到程式碼塊中,其他執行緒只能在外面等待著(Blocked阻塞狀態)