一,線程概述java
1.進程:正在運行的程序安全
2.線程:進程中同時運行的多個執行單元多線程
關鍵字:共享資源,spa
3.多線程可使:多段程序代碼交替運行(一段程序代碼能夠看作一個線程任務)線程
二,線程的建立code
1.繼承Thread類,重寫run()方法對象
(1)建立代碼blog
MyThread thread1=new MyThread(「thread1」); MyThread thread2=new MyThread(「thread2」);
2.實現Runnable接口,重寫run()方法繼承
(1)建立代碼接口
MyThread myThread=new MyThread(); //多了步建立繼承類的實例對象 Thread thread1=new Thread(myThread,「thread1」); Thread thread2=new Thread(myThread,「thread2」);
3.實現Callable接口,重寫call()方法,並使用Future來獲取call()方法的返回結果
(1)建立代碼
MyThread myThread=new MyThread(); FutureTask ft1=new FutureTask(myThread); //多了部包裝 Thread thread1=new Thread(ft1,「thread1」); FutureTask ft2=new FutureTask(myThread); Thread thread2=new Thread(ft2,「thread2」);
三種實現方法對比:
(2)每種方法都比前一種多了一步
(2)實現Runnable或Callable 適合多個線程去處理同一個共享資源的狀況,將線程同程序代碼、數據有效分離
繼承Thread沒法資源共享。故只能建立一個售票程序,而後開啓多個線程去共享同一個售票對象的售票方法,即讓4個線程運行同一個售票程序
(3)避免java單繼承帶來的侷限性
三.線程的生命週期及狀態轉換
四.線程的調度
1.定義:java虛擬機爲線程分配CPU的使用權
2.分時調度模型/搶佔式調度模型。java虛擬機默認採用搶佔式調度模型
3.線程的優先級
(1)優先級越高得到CPU的機會越大
4.線程休眠 Thread.sleep(long millis)
(1)定義:使正在執行的線程暫停,把CPU讓給其餘線程
(2)Running--->Timed_Wating--->Ready 休眠時間完了纔會進入Ready狀態,纔有機會得到CPU
5.線程讓步 Thread.yield()
(1)與線程休眠的區別:不會阻塞該線程,只是將線程直接轉換到Ready狀態,讓系統的調度器從新調度
6.線程插隊 thread2.join()
五.多線程同步
(多線程去訪問同一個資源,也會引起一些安全問題)
(前面經過實現Runnable接口的方式,並不能徹底解決線程同步問題)
定義:爲了解決線程安全問題,限制某個資源在同一時刻只能被一個線程訪問
1.線程安全
解決:處理共享資源的代碼在任意時刻只能有一個線程訪問
2.同步代碼塊 synchronized(lock)
3.同步方法 修飾符synchronized
4.同步鎖 Lock lock(lock.lock(),lock.unlock())
5.死鎖問題
六.多線程通訊 wait()/notify(),notifyAll()
(1)wait() 使當前線程進入等待狀態
notify()/notifyAll() 喚醒當前處於等待狀態的線程
七.線程池
續:
1.wait和sleep的區別
(1).調用wait()方法會釋放對象的鎖。所以wait方法通常被用於同步方法或者同步代碼塊中
(2).與wait方法不一樣的是,sleep方法不會釋放當前佔有的鎖
2.多線程中,爲了保證數據的一致性,一般須要在使用對象或者方法前加鎖
3.同步塊是訪問共享資源的代碼塊。給共享資源上了個鎖