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