程序是程式的一次執行過程,是系統執行程式的基本單位,因此程序是動態的。系統執行乙個程式即是乙個程序從建立,執行到消亡的過程。如下圖所示,在 windows 中通過檢視任務管理器的方式,我們就可以清楚看到 window 當前執行的程序(.exe檔案的執行)。執行緒與程序相似,但執行緒是乙個比程序更小的執行單位。乙個程序在其執行的過程中可以產生多個執行緒。與程序不同的是同類的多個執行緒共享同一塊記憶體空間和一組系統資源,所以系統在產生乙個執行緒,或是在各個執行緒之間作切換工作時,負擔要比程序小得多,也正因為如此,執行緒也被稱為輕量級程序。同步和非同步 同步和非同步通常用來形容一次方法呼叫。同步方法呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才能繼續後續的行為。非同步方法呼叫更像乙個訊息傳遞,一旦開始,方法呼叫就會立即返回,呼叫者可以繼續後續的操作。 關於非同步目前比較經典以及常用的實現方式就是訊息佇列:在不使用訊息佇列伺服器的時候,使用者的請求資料直接寫入資料庫,在高併發的情況下資料庫壓力劇增,使得響應速度變慢。但是在使用訊息佇列之後,使用者的請求資料傳送給訊息佇列之後立即 返回,再由訊息佇列的消費者程序從訊息佇列中獲取資料,非同步寫入資料庫。由於訊息佇列伺服器處理速度快於資料庫(訊息佇列也比資料庫有更好的伸縮性),因此響應速度得到大幅改善。
併發(concurrency)和並行(parallelism) 併發和並行是兩個非常容易被混淆的概念。它們都可以表示兩個或者多個任務一起執行,但是偏重點有些不同。併發偏重於多個任務交替執行,而多個任務之間有可能還是序列的。而並行是真正意義上的「同時執行」。
多執行緒在單核cpu的話是順序執行,也就是交替執行(併發)。多核cpu的話,因為每個cpu有自己的運算器,所以在多個cpu中可以同時執行(並行)。
高併發 高併發(high concurrency)是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。
高併發相關常用的一些指標有響應時間(response time),吞吐量(throughput),每秒查詢率qps(query per second),併發使用者數等。
臨界區 臨界區用來表示一種公共資源或者說是共享資料,可以被多個執行緒使用。但是每一次,只能有乙個執行緒使用它,一旦臨界區資源被占用,其他執行緒要想使用這個資源,就必須等待。在並行程式中,臨界區資源是保護的物件。
阻塞和非阻塞 非阻塞指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回,而阻塞與之相反。
以上內容**別人部落格,尊重原創
public
class
threadonetest
implements
runnable
}public
static
void
main
(string[
] args)
}
話不多說,直接**演示public
class
threadonetest2
extends
thread
}public
static
void
main
(string[
] args)
}
建立callable介面的實現類,重寫call(),call() 方法就是執行緒的執行體,call() 有返回值。使用futuretask類的例項,來包裝callable物件,即把callable的例項以形參的方式傳入new futuretask()的建構函式中
使用futuretask物件作為thread物件的target建立啟動執行緒
通過futuretask例項物件呼叫get()方法得到子執行緒的返回值
public
class
demo
}//獲取子執行緒的返回值
trycatch
(interruptedexception e)
catch
(executionexception e)}}
/** 1. thirdthreadcallable 實現callable 介面
*/class
thirdthreadcallable
implements
callable
return i;
}}
3.4.1、使用實現runnable 、callable介面的方式建立多執行緒
優點
執行緒類只是實現了runnable介面或callable介面,同時還可以繼承其他類
多個執行緒可以共享乙個target物件,非常適合多個相同執行緒來處理同乙份資源的情況,從而可以將cpu、**、資料分開,形成清晰的模型,較好的體現了物件導向的思想
缺點
程式設計稍微複雜,如果需要訪問當前執行緒,必須使用thread.currentthread()方法
3.4.2、使用繼承thread類的方式建立多執行緒
優點
編寫簡單,如果要訪問當前執行緒,無需使用thread.currentthread()方法,可以直接使用this的方式獲取當前執行緒
缺點
1.因為執行緒類已經繼承了thread類,所以不能再繼承其他的父類
一般情況下,專案中推薦使用runnable介面或callable介面建立多執行緒。
static thread currentthread()
返回對當前正在執行的執行緒物件的引用。
string getname()
返回此執行緒的名稱。
intgetpriority()
返回此執行緒的優先順序
thread.state getstate()
返回此執行緒的狀態。
void
interrupt()
中斷這個執行緒。
static
boolean
interrupted()
測試當前執行緒是否中斷。
boolean
isalive()
測試這個執行緒是否活著。
void
join()
等待這個執行緒死亡。
void
join
(long millis)
等待這個執行緒死亡最多 millis毫秒。
void
join
(long millis,
int nanos)
等待最多 millis毫秒加上 nanos納秒這個執行緒死亡。
void
run(
) 如果這個執行緒使用單獨的runnable執行物件構造,則呼叫該runnable物件的run方法; 否則,此方法不執行任何操作並返回。
void
setname
(string name)
將此執行緒的名稱更改為等於引數 name 。
void
setpriority
(int newpriority)
//優先順序的引數是1-10,數字越大,優先順序又高
更改此執行緒的優先順序。
static
void
sleep
(long millis)
使當前正在執行的執行緒以指定的毫秒數暫停(暫時停止執行),具體取決於系統定時器和排程程式的精度和準確性。
static
void
sleep
(long millis,
int nanos)
導致正在執行的執行緒以指定的毫秒數加上指定的納秒數來暫停(臨時停止執行),這取決於系統定時器和排程器的精度和準確性。
static
void
yield()
對排程程式的乙個暗示,即當前執行緒願意產生當前使用的處理器。
多執行緒的生產者消費者模式,此處 Java基礎之多執行緒
實現介面runnable 實現介面callable 結合執行緒池 實現callable介面或者runnable介面 呼叫如下方法即可 結束任務 執行緒池方式 初始化執行緒池 executorservice pool executors.newfixedthreadpool 2 可以執行runnabl...
Java基礎之多執行緒
1.多執行緒的實現方式 1.繼承thread public class demo2 thread class mythread extends thread 2.實現runnable介面public class demo3 runnable class myrunnable implements r...
Java基礎 Java重點基礎之多執行緒(一)
一,多執行緒的引入 2.多執行緒的應用場景 b jvm的啟動是多執行緒的嗎 五,多執行緒程式實現的方式2 六,實現runnable的原理 七,兩種方式的區別 掌握 繼承thread 實現runnable介面 八,匿名內部類實現執行緒的兩種方式 new thread 繼承這個類 public void...