二.3 java高級-多線程

一,線程概述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.同步塊是訪問共享資源的代碼塊。給共享資源上了個鎖

相關文章
相關標籤/搜索