多進程:在操作系統(tǒng)中能運行多個任務。
多線程:在同一個應用程序中有多個順序流執(zhí)行。
兩者區(qū)別:進程擁有自己完整的變量,線程則共享相同的數(shù)據(jù)。
JVM有一個主線程,啟動Java程序則啟動他,并調(diào)用程序的main()方法,多線程是通過虛擬CPU實現(xiàn),通過java.lang.Thread類實現(xiàn),繼承Thread類。
構(gòu)造方法:
Thread()
Thread(Runable target)
Thread(Runable target,String name)
啟動線程用run()方法,自動調(diào)用。
start()進入可運行狀態(tài),通過“.”來調(diào)用。
1.實現(xiàn)Runable接口定義唯一的run()方法。
Class rt = new Class();
Thread t = new Thread(rt);
t.start();
2.繼承Thread類。
Thread t = new Thread();
t.start();
兩者的區(qū)別:
1.Runable 可以從其他類繼承,保持程序風格一致性。
2.Thread 不能再從其他類繼承。
結(jié)束線程:
1.run()方法執(zhí)行完畢。
2.拋出一個異常或錯誤。
3.調(diào)用一個Deprecated的stop()方法。(過時)
后臺線程為其他線程提供服務,優(yōu)先級最低,級別0-10,默認級別為5。
如:Thread dt = new Thread();
??????? dt.setDaemon(true);??? //設置成后臺線程
??????? dt.start();
線程控制:
測試線程是否處于Runable狀態(tài)???isAlive()方法。
中斷線程
?Thread.sleep()中斷時間以毫秒為單位。
?Thread.yield()放棄執(zhí)行,執(zhí)行不低于此線程的其他線程。
設置線程的優(yōu)先級
getPriority() 獲取
setPriority() 設置
對象方法
wait()處于等待狀態(tài),等待被喚醒。
notify()/notifyAll() 喚醒線程/所有線程。
join()調(diào)用這個方法主線程,等待加入子線程完成。
異常為 InterruptedException e 。
Thread.currentThread().isAlive();?? // 獲取當前線程是否處于Runable狀態(tài)
Thread.currentThread().getName();? //獲取當前線程的名字
互斥鎖:保證共享數(shù)據(jù)的完整性。每個對象對應一個標記,保證在任一時刻,只能有一個線程訪問該對象,使用synchronized關鍵字修飾。放在方法、對象、塊前。
釋放鎖用break,return或拋出exception自動釋放;調(diào)用wait()方法將放棄擁有的對象鎖。
如:public void method() {
???????????????synchronized(obj) {
???????????????}
?????????}
?????????等同于
?????????public synchronized void method() {
?????????}
死鎖:兩個線程都在等待對象鎖,不可避免。