線程是程序執行的最小單位,是動態的。
進程是系統進程資源分配和系統調度的最小單位,是動態的。
線程和進程的目的:多任務--->效率高java
在同一個時間點只能執行一個進程或線程
在同一個時間段能夠執行多個進程或線程安全
多進程的數據不共享,每一個進程都有本身的獨立內存空間。多線程數據的進程的數據是共享的,每個線程又有本身獨立堆棧區空間。線程與線程之間是獨立的,相互之間不受影響。多線程
一個程序能夠啓動多個進程
一個進程能夠啓動多個線程
線程必須經過進程啓動,不能獨立存在的。併發
.class運行在JVM上,.class就是一個一個的線程。JVM就是一個進程。線程
運行線程,全部線程共享CPU。只有線程搶佔CPU成功纔會執行。code
線程運行過程當中執行的代碼塊。線程啓動以後會執行public void run()的方法。對象
1)局部變量是多線程不共享
2)extends Thread方式實現多線程,靜態變量是共享,實例變量不共享
3)implements Runnable方式實現多線程,靜態變量是共享的,實例變量也共享繼承
class MyThread extends Thread{ public void run(){ } } 建線程:Thread t1=new MyThread(); //不要t1.run()來企圖啓動線程,那是單純的調用該方法,並無啓動一個線程 啓動線程: t1.start();
class MyThread implements Runnable{ public void run(){ } } 建立線程:MyThread m=new MyThread(); Thread t1 = new Thread(m); 啓動線程: t1.start();
getName(): 獲取當前線程的名字
static sleep(long): 強制當前正在執行的線程休眠(暫停執行),只是讓出CPU,但不會釋放鎖。
static currentThread(): 獲取當前正在執行的線程。進程
Thread類中的方法:
getName():獲取當前線程的名字
static sleep(long):強制當前正在執行的線程休眠(暫停執行),以「減慢線程」。
static currentThread():獲取當前正在執行的線程。事件
線程的運行時搶佔式,因此線程的執行結果是不可預知的。
java單繼承
class Test extends Student implements Runnable{ }
a)新建狀態(new):線程對象已經建立,尚未在其上調用start()方法。
b)就緒狀態(Runnable): 線程已經準備好了,等待CPU的調度,當線程有資格行,但調度程序尚未把它選定爲運行線程時線程所處的狀態。當start()方法調用時,線程首先進入就緒狀態。在線程運行以後或者從阻塞、等待或睡眠狀態回後,也返回到就緒狀態。就緒狀態維護了一個線程池。 全部的就緒狀態的線程都會進入到線程池中。
c)運行狀態(Running):線程調度程序從可運行池中選擇一個線程做爲 當前線程時線程所處的狀態。這也是線程進入 運行狀態的惟一一種方式。CPU正在執行的線程。
d)等待/阻塞/睡眠狀態:這是線程有資格運行時它所處的狀態。實際上這個三狀態組合爲一種,其共同點是:線程仍舊是活的,可是當前沒有條件運行。換句話說,它是可運行的,可是若是某件事件出現,他可能返回到就緒狀態。
e)死亡狀態:當線程的run()方法完成時就認爲它死去。這個線程對象也許是活的,可是,它已經不是一個單獨執行的線程。線程一旦死亡,就不能復生。 若是在一個死去的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常。
1)使用標誌變量中斷線程。就好像開車同樣。
2)使用stop()已通過時了,雖然它確實中止了一個正在運行的線程,然而,這種方法是不安全也是不受提倡的。
join(): 等待線程的執行結束。在哪一個線程中調用就誰等待。誰調用該方法就等待誰。
interrupt(): 中斷阻塞中的線程。不能中斷正在執行的線程。
isInterrupted(): 判斷是否被中斷
static interrupted(): 清空中斷信息
synchronized(共享區){臨界區}
共享區:多線程同時操做同一個對象
臨界區:多線程對共享區進行操做的代碼區
將全部影響的方法都定義成線程安全的方法就變成了線程安全的類。synchronized能夠放在方法上,就是一個同步方法。
同步鎖有不少種,這裏只是簡單的描述了一下synchronized關鍵字,關於具體的使用和細節,後續會專門推出一篇文章來說。
歡迎訪問個人騰訊雲+社區:傳送門