進程:是一個正在執行中的程序,
每一個上進程執行都有一個執行順序,順序是一個執行路徑,或者叫一個控制單元.
線程:就是進程中的一個獨立的控制單元.
線程在控制着進程的執行.
一個進程中至少有一個線程.java
java VM啓動的地時候會有一個進程java.exe ,該進程中至少一個線程負責java程序的執行.並且這個線程運行的代碼在於main方法中.該線程就是主線程main安全
jvm啓動不止一個線程,還有負責GC的線程多線程
多線程就一個目的,多段代碼同時執行.相要多段代碼同時執行時就用多線程jvm
java多線程2—建立線程ide
/** * 建立線程的線種方式一,繼承Thread,重寫run方法 */ public class Test03 { public static void main(String[] args) { //這是建立一個線程,會有一個獨立的線程內存空間 ThreadDemo demo = new ThreadDemo(); // 使該線程開始執行;Java 虛擬機調用該線程的 run 方法。 demo.start(); } } /** * 定義一個線程類,(就是繼承Thread) * Override run方法.run方法中的代碼就是這個線程要執行的代碼.(線程體) */ class ThreadDemo extends Thread{ @Override public void run() { System.out.println("一個線程"); } }
java多線程3-線程的幾種狀態this
1,被建立—start()—運行—sleep(time)—>凍結spa
-->wait() -->凍結線程
notify<-- code
2,阻塞狀態.--等待執行權,有執行權對象
3,凍結-放棄了執行權,
4,消亡狀態.
java多線程3-Thread類認識
獲取線程對象及名稱
線程的默認名稱Thread-編號.編號從0開始.
1,getName()方法獲得線程名.
2,setName()設置線程名稱.
在構造方法方中給線程設置名字
class Test extends Thread{ //構造方法中,設置線程名字. Test(Stirng name){ //能夠直接super()由於父類中已定義 super(name) } public void run(0{ //TODO } }
static curentThread():至關於線程中this.獲取當前線程對象.靜態的
線程狀態異常
同一個線程屢次.start(),一個線程已是在運行了,在去調用start().就是IllegalThreadStateException()
java多線程4-建立線程2
第二種建立線程的方法,實現Runnabl接口.
/** * 建立線程的第二種方法 */ public class Test03 { public static void main(String[] args) { //這裏並無建立線程,只是定義的一個Runnable的子類. ThreadDemo demo = new ThreadDemo(); //這裏纔是建立了4個線程 Thread t1 = new Thread(demo); Thread t2 = new Thread(demo); Thread t3 = new Thread(demo); Thread t4 = new Thread(demo); //這樣才能夠同時開啓多線程執行同一代碼. t1.start(); t2.start(); t3.start(); t4.start(); } } /** * 實現Runnable接口,Runnable接口只有一個抽象的run方法. */ class ThreadDemo implements Runnable{ @Override public void run() { System.out.println("一個線程"); } }
Runnable接口的定義就是爲了規範線程要執行的代碼的存入的位置.(就是run方法)
注意:run方法中的異常只能try,
多線程中明確的幾點:
1,明確哪些代碼是多線程運行代碼.
2,明確共享數據
3,明確多線程行動代碼中哪些語句操做共享數據的.
java多線程5-鎖
1,同步方法用的是this對象,靜態方法同步用的是Class對象
2,死鎖:同步中嵌套同步,兩個同步的鎖確不一樣.
3,線程訪問共享數據的安全,因此要用鎖.
java多線程6-線程等待與喚醒
1,線程運行的時候內存中會創建一個線程池,等待線程都在存在這個線程池中notify()喚醒的通常線程池中第一個等待的線程
wait(),notify(),notifyAll()都使用在同步中,由於要對持有的鎖的線程操做.
只有同一個鎖上的被等待線程,能夠被同一個鎖上的線程notify喚醒
也就是:等待和喚醒必須是同一個鎖.
在多線程的時候要注意兩點,
1,循環判斷標記--所要用while
2,還要喚醒對方線程,也就是要通知的線程,用notifyAll()喚醒全部.爲了不全部線程都wait().不過用notifyall()也有一個缺點會喚醒本方線程.
java多線程7-JDK1.5以後
1,顯示的鎖機制.Lock裏面的lock和nulock
2,Object中的wati,notify,notifyAll 替換了Condition對象.
3,該對象能夠Lock進行獲取,能夠實現本方線程只喚醒方線程
java多線程7-線程的中止
1,中止線程只有一個種方法,那就是run方法結束.
2,開啓多線程,一般都要用循環結構.(你不用循環的話,就在一個線程裏面跑得了,反正你run方法就那幾行代碼,運行完了還不是單線程)
3,因此只要控制好循環就能夠,控制好線程何時結束.
interrupt()—這個方法,是中斷線程.就是清除線程的凍結狀態.讓線程運行下去,把run方法運執行完.而後結束線程.
會拋出InterruptException
其它方法:
jion方法--等待該線程結束.在A線程是指使B線程去調用jion方法,那麼A線程就會等到B線程結束後在去運行.
setDaemon(true)--那個線程調用這個方法,那麼這個線程就會變成後臺線程(守護線程).可是不知道它守護那個線程.
yield()--暫停當前正在執行的線程對象,並執行其它線程.