多線程&定時器Timer&同步&線程通信&ThreadLocal
阿新 • • 發佈:2018-03-28
技術分享 mar ribbon ++ AI ring 線程組 com fast
1.多線程
- 線程狀態分為:新建狀態、就緒狀態、運行狀態、阻塞狀態、死亡狀態
- 對象等待池的阻塞狀態:運行狀態執行了wait方法
- 對向鎖池的阻塞狀態:試圖獲得某個同步鎖,已經被其他線程占用,就會放到對象的鎖池中
- 其他阻塞狀態:執行了sleep()方法、join方法()
- 線程睡眠Thread.sleep()方法:當前線程放棄cpu,轉到阻塞狀態
- 線程讓步Thead.yield()靜態方法:如果此時具有相同優先級的其他線程處於就緒狀態,那麽 yield()方法將把當前運行的線程放到可運行池中並使另一個線程運行。如果沒有相同優先級的可運行線程,則此方法什麽都不做。
- 等待其他線程結束 join()方法:當前運行的線程可以調用另一個線程的 join()方法,當前運行的線程將轉到阻塞狀態,直至另一個線程運行結束,它才恢復運行。
- machin.join() 就是執行的這個線程停止讓給machin線程運行
- 設置後臺線程 Thread.setaemon(true)方法,就可以把當前線程設置為後臺線程
2.定時器Timer
Timer timer = new Timer(true) //把與Timer關聯的線程設置為後臺線程 TimerTask task = new TimerTask(){//匿名內部類實現run方法 timer.schedule(task,10,500); //task用來設定所要定時器執行的任務;10為延遲執行的時間ms;500為每隔500ms重復執行一次任務 }
2.同步
- 同步代碼塊
- synchronized(this){} this表示引用當前類對象的鎖
- 同步方法鎖
- public synchronized String pop(){}
- 什麽情況會釋放鎖?
- 執行完同步代碼塊,就會釋放鎖
- 在執行同步代碼塊的過程中,遇到異常而導致線程終止,鎖也會被釋放
- 在執行同步代碼塊的過程中,執行了鎖所屬對象的wait()方法,這個線程會釋放鎖,進入對象的等待池
- 什麽情況不會釋放鎖?
- 在執行同步代碼塊的過程中,執行了 Thread.sleep()方法,當前線程放棄 CPU,開始睡眠,在睡眠中不會釋放鎖
- 在執行同步代碼塊的過程中,執行了 Thread.yield()方法,當前線程放棄 CPU,但不會釋放鎖
- 在執行同步代碼塊的過程中,其他線程執行了當前線程對象的 supend()發昂發,當前線程被暫停,但不會釋放鎖。Thread類的 supend()方法已經被廢棄
3.線程通信
- wait():執行該方法的線程釋放對象的鎖,Java虛擬機把該線程放到該對象的等待池中。該線程等待其他線程將它喚醒
- notify():執行該方法的線程喚醒在對象的等待池中等待的一個線程。Java虛擬機從對象等待池中隨機選擇一個線程,把它轉到對象的鎖池中
4.中斷阻塞
- 當線程 A 處於阻塞狀態時, 如果線程 B 調用線程 A 的 interrupt()方法,那麽線程 A 會接收到一個 InterruptedException,並退出阻塞狀態,開始進行異常處理
5.線程控制
- start():啟動線程
- suspend():使線程暫停(被廢棄)
- resume():使暫停的線程恢復運行(被廢棄)
- stop()::終止線程(被廢棄)
6.線程組
- ThreadGroup類的 activeCount()方法:獲得當前或者的線程的數目
- ThreadGroup類的 enumerate(machines)方法:該方法把當前活著的線程引用存放到參數machines中
-
main(){ ThreadGroup group = new ThreadGroup("machines"); for(int i = 1;i <= 5;i++){ Machine machine = new Machine(group,"machine"+i); machine.start(); } int activeCount = group.activeCount(); Thread[] machines = new Thread[activeCount]; group.enumerate(machines); for(int i = 0;i < activeCount;i++) syso(machines[i].getName()+" is alive"); }
7.ThreadLocal
- ThreadLocal類 可以用來存放線程的局部變量,每個線程都有單獨的局部變量,彼此之間不會共享
- public T get():返回當前線程的局部變量
- protected T initialValue():返回當前線程的局部變量的初始值
- public void set(T value):設置當前線程的局部變量
- ThreadLocal類中有一個Map 緩存,用戶存儲每一個線程的局部變量
多線程&定時器Timer&同步&線程通信&ThreadLocal