對java多線程的認識


多線程的概念:多線程是一種機制,它允許在程序中並發的執行多個線程,且每個線程間相互獨立。

實現多線程的兩種方式:

1、繼承java.lang.Thread類,並且重寫它的run方法,將線程的執行主體放在其中;

2、實現java.lang.Runnable接口,實現它的run方法,並將線程的執行主體放在其中;

線程有五大狀態:

1、新建狀態(New):使用new操作符創建一個線程的時候,線程還沒有開始執行;

2、就緒狀態(Runnable):當線程調用了start方法之后,線程就進入就緒狀態;處於就緒狀態的線程不一定立即運行run方法,只有獲取到cpu時間才可以執行run方法;

3、運行狀態(running):當線程獲取到了cpu運行時間之后,就進入到運行狀態了,調用run方法;

4、阻塞狀態(blocked):正在運行的線程還沒有結束,暫時讓出cpu,這時其他就緒線程就有機會獲得cpu時間;

以下原因會導致線程進入阻塞狀態:

1、線程調用sleep方法進入睡眠狀態;

2、線程在調用一個在i/o上被阻塞的操作

3、線程試圖去獲得一個鎖,但是這個鎖被其他線程持有;

。。。。。。

5、死亡狀態(Dead):

有以下的原因可導致線程死亡:

1、run方法正常退出而正常死亡;

2、一個未捕獲的異常導致線程意外退出而死亡;

可以用isAlive方法來判斷線程是否還活着,只要是線程處於運行或者阻塞狀態,就返回true;如果線程狀態是New且不是可運行的狀態或者線程死亡了,則返回false;

 

線程同步(synchronized):

可以同步方法,也可以同步代碼塊;對於同步方法來說,每個方法只有獲取到所屬類實例的鎖才可以被執行,一旦該方法被執行,則獨占鎖,知道方法返回時或者異常退出時才會釋放掉鎖;

同步代碼塊也是一樣,當兩個並發線程訪問同一個對象中的這個synchronized(this)代碼塊的時候,一個時間內只有一個線程得到執行,另一個線程只有在這個線程執行完成之后才可以執行;

線程同步之Lock:

Lock是一個接口,它位於java 5.0新增的java.utils.concurrent包的子包locks中,實現Lock接口類具有與synchronized關鍵字相同的功能,但是它的功能強大一些,java.utils.concurrent.locks.ReentrantLock是比較常用的;注意需要在finally中unlock釋放鎖;

線程阻塞:

sleep()方法、suspend和resume方法、yield方法、wait和notify方法都可以使線程進入阻塞狀態;但是yield方法和wait方法都會釋放cpu時間,而sleep方法和suspend不會釋放cpu時間;

終止線程的方法:

1、當run方法執行完畢,自動終止;

2、使用stop方法,不過這個方法不推薦使用,會有意料不到的后果;

3、使用interrupt方法

多個客戶端一個服務器的實現方法:

利用多線程技術,服務器socket負責監聽端口,設置一個無限循環,在其中實現:將監聽到的socket實例賦值 給線程並且啟動線程,由線程來完成業務邏輯;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM