線程基礎知識
首先了解一下JVM、棧和堆
1棧:JVM中一個線程一個棧內存,棧內存是獨立的,棧中儲存局部變量,所以局部變量的內存不共享,不會存在線程問題。
2堆:JVM中只有一個堆,堆內存是多線程共享的,堆內存中儲存的是對象,java對象內部儲存成員變量/實例變量,所以實例變量有可能存在線程問題。
3 JVM中只有一個方法區,發放區存在多線程共享,方法區中儲存的靜態變量存在線程安全問題。
進程:是指一段正在執行的程序,二線程有時也叫做輕量級進城。
線程:是指程序在執行過程中,能夠執行程序代碼的一個執行單元。
一個進城可以有多個線程。
同步和異步: 可以通過synchronized來實現同步操作。
線程的生命周期分為五種狀態:
1 新建 2 就緒 3 運行 4 死亡 5 阻塞
線程的創建有三種方式,一種是 繼承thread類,重寫run()方法 另一種是 實現Runnable接口,實現run()方法第三種是實現Callable接口,重寫call()方法
Callable比Ruannable的功能強大,主要表現在
1 Callable可以在任務結束是有返回值,ruannable 沒有
2 Callable可以拋出異常,ruannable沒有
3 運行Callable可以拿到一個Future對象,表示異步計算的結果,提供檢查計算的是否完成的方法。
star()方法和run()方法的區別:
start()方法是異步執行的,而run方法是同步執行,只有調用線程類的star()方法才能達到多線程的目的。
多線程同步的實現的方法有哪些?
(1) 通過synchronized關鍵字 (synchronized方法 還有 synchronized塊)
(2) wait() 方法和notify()方法
(3) Lock JDK 5 新增加的特性
sleep() 方法和wait() 方法有什麽區別?
sleep()是使線程短暫休息一會的方法而 wait() 是一種使線程暫停執行的方法。
(1)原理不同: sleep()方法是thread類的靜態方法 ,是線程用來控制自身流程的,他會暫停一段時間,等時間到了會進入蘇醒。
wait() 方法是object類中的方法,用於線程之間的通信,會使擁有該對象鎖的進程等待,直到其他線程調用notify() 方法時,才能醒來
(2)對鎖的處理機制不用: sleep()方法的主要作用是讓線程休息一會等時間到了則自動恢復,不涉及到線程通信問題,所以不會釋放鎖,當調用wait()
方法後,線程會釋放掉他 當前占用的鎖,從而使線程所在對象的其他synchronized數據可以被別的線程使用。
(3) 使用區域不同: 由於wait()方法的特殊意義,因此它必須放在同步控制方法或者 同步語句塊中 使用,而sleep則可以在任意地方
使用
引申 : sleep () 和yield() 方法有什麽區別?
(1) sleep() 方法給其他線程運行機會時不考慮線程的優先級,會給低優先級的線程運行機會,而yield()方法只會給相同優先級或更高優先級線程以運行的機會。
(2) 線程執行sleep()方法時會轉入阻塞狀態,所以在指定的時間內肯定不能被執行,而yield() 方法只是使當前線程重新回到課執行的狀態,所以執行yield()方法的線程有可能在進入到可執行狀態中又被執行到。
(3) sleep() 方法聲明拋出一個InterruptedException,而yield() 方法沒有。
(4) sleep() 方法比yield() 有更好的 移植性(與操作系統有關)
終止線程的方式有哪些?
3中方式
1 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。
2 thread.stop() 這種相當於直接拔掉電源
2 thread.interrupt() 來終止線程,這個會拋出一個異常,通過捕獲異常信息而跳出run()達到終止線程的方式
什麽是守護線程?
守護線程是程序在 運行時,在後臺提供的一種通用服務的線程,典型例子就是垃圾回收器
守護線程和用戶線程幾乎一樣,只不過如果所有的用戶線程都退出了運行,只剩下守護線程,那麽JVM就會停止,守護線程也就退出了
。守護線程無非就是在用戶線程啟動前調用對象的setDaemon(true)的方法
join方法的作用:
讓調用該方法的線程在執行完run()方法後,在執行run()方法後面的代碼
線程基礎知識