[筆記]Java多線程概略

線程的定義和狀態(tài)

創(chuàng)建、就緒、運(yùn)行、阻塞、停止

線程優(yōu)先級

線程優(yōu)先級的系統(tǒng)規(guī)則
線程是具有優(yōu)先級的,高優(yōu)先級的線程有更多CPU資源。
繼承-線程優(yōu)先級具有繼承性,如果ThreadA啟動了ThreadB,B默認(rèn)具有和A一樣的優(yōu)先級。(this.priority = parent.getPriority();)
設(shè)置-優(yōu)先級可以手動設(shè)置。
并行-高優(yōu)先級的線程能獲得更多CPU資源,但是低優(yōu)先級的線程也能繼續(xù)工作,高優(yōu)先級并不會先執(zhí)行
隨機(jī)-高優(yōu)先級的線程并不一定先執(zhí)行,執(zhí)行順序是隨機(jī)的。
線程優(yōu)先級的設(shè)置
Thread和HandlerThread設(shè)置優(yōu)先級的方式不一樣。
Thread中線程優(yōu)先級范圍是1~10,數(shù)值越高,優(yōu)先級越高,默認(rèn)是5。
java.lang.Thread.setPriority(int i);
HandlerThread中線程優(yōu)先級范圍是-20~19,數(shù)值越低,優(yōu)先級越高,默認(rèn)為0。
android.os.Process.setThreadPriority(int p);
android.os.Process.setThreadPriority(int tid, int p);
HandlerThread還可以通過new HandlerThread("tname",-3)來設(shè)置。
在Thread或Runnable的run方法中,也可以通過Process.setThreadPriority設(shè)置優(yōu)先級。
一般在實(shí)際應(yīng)用中,通過Process設(shè)置優(yōu)先級,對線程調(diào)度影響效果更明顯,因?yàn)镻rocess是android系統(tǒng)特別優(yōu)化過的,是native的方法。

線程操作

同步
同步方式:synchronized和lock
同步相關(guān)方法:wait()/notify()/notifyAll() sleep()/join()/yield() await()/signal()/signalAll

常用的線程類

Thread和HandlerThread
在使用場景上,HandlerThread更節(jié)省資源:
如果多次調(diào)用new Thread(){...},會創(chuàng)造多個匿名線程,銷毀資源
使用HandlerThread,是通過Looper緩存任務(wù),重用線程,節(jié)省資源開銷
Thread、Runnable和Callable
Runnable是個接口,實(shí)現(xiàn)更加靈活,而且一個Runnable的實(shí)例可以被多個Thread復(fù)用

線程池

線程池可以節(jié)約創(chuàng)建和銷毀線程的資源開銷。

  1. 線程池常見的幾個類的用法:
    ThreadPoolExecutor、Executor,Executors,ExecutorService,CompletionService,F(xiàn)uture,Callable 等
  2. 線程池四個分類
    newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool和SingleThreadExecutor
  3. 自定義線程池 ThreadPoolExecutor
    線程池工作原理
    核心線程數(shù)、等待隊(duì)列、處理策略等

Handler、Thread和Runnable

Runnable是接口,可避免單繼承局限,使用更靈活,且一個實(shí)例可以給多個thread共享。
Thread其實(shí)是一個對象,thread有thread.run()和thread.start()兩種方法,run方法其實(shí)沒有新建線程,而是在當(dāng)前線程中直接執(zhí)行;start才會真正創(chuàng)建一個線程,start帶有synchronized同步鎖,且一個nativeCreate的native方法去請求CPU,這個函數(shù)會把Thread自己的實(shí)例傳進(jìn)去,是c++實(shí)現(xiàn)的,sleep/interrupt等方法都是在這里實(shí)現(xiàn)的。
Handler是用來和Looper中的消息隊(duì)列交互的,handler通過ThreadLocal獲取Looper的MessageQueue,可以向queue中添加message,message的target又指向handler,這樣Looper循環(huán)處理消息時,會把消息再交給handler去處理。

sleep() wait() join() yield()

sleep阻塞暫停,不釋放鎖和cpu
wait釋放鎖和cpu,需要被notify才能喚醒
join是暫停當(dāng)前線程,先執(zhí)行join進(jìn)來的線程
yield是把當(dāng)前線程設(shè)為可執(zhí)行狀態(tài),給同等或更高優(yōu)先級的其他線程一個執(zhí)行機(jī)會,線程yield之后,很有可能繼續(xù)恢復(fù)執(zhí)行

引用

全面理解Java內(nèi)存模型
Java多線程系列目錄(共43篇)
Android開發(fā)——Android中常見的4種線程池(保證你能看懂并理解)
Handler、Thread和Runnable簡單分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容