Day3-2 abstract、final、static、多線程、線程計數器和分頁算法

Abstract

抽象類是介於接口和普通類之間的類。一個類只要存在未被初始化的抽象屬性或未被定義的抽象方法,該類就必須定義爲抽象類。

接口中的屬性和方法,必須被子類實現;抽象類的屬性和方法則不一定要被實現,父類沒實現的,子類也可以不實現,只要將子類也定義爲抽象類即可,意味着可以留給孫子實現。

Final

Final就是將對象定義爲最終版,是一種限制面向對象的機制。Final修飾的對象不能被繼承,修飾的方法必須被實現不能被重寫但可以被重載,修飾的屬性必須被初始化,不能被二次修改。

Final不能修飾接口和抽象類。基本上Final和Abstract是衝突的概念,前者不能被修改,後者留着等待被定義或實現。

Static

Staic修飾的屬性或方法,在類加載時就會被調用,並且在構造方法之前被調用,因此static定義的屬性或者方法在全局只有一個,由類直接調用,無需創建對象來調用。

多線程

線程原理

五個狀態:新建狀態、就緒狀態、運行狀態、阻塞狀態和死亡狀態

1.當一個線程類被new時,線程對象還沒開始運行,處於新建狀態;

2.當線程對象調用start()時,線程被啓動並且運行所需的系統資源會被創建,當start()方法返回後,線程處於就緒狀態,但此時run()方法不一定立即被執行,需等待cpu等資源競爭成功纔會執行;

3.多個處於就緒狀態的線程由系統的線程調度程序來調度執行,某個線程獲得CPU時間後,開始執行run()進入運行狀態;

4.若某個或某些線程run()代碼邏輯造成死循環,始終佔用cpu不釋放,則可能導致線程進入阻塞狀態;

5.當線程的run()方法執行完畢,則進入死亡狀態;

線程實現方式

多線程的實現方式一:線程類通過重寫run()方法繼承Thread類,並創建該線程類的對象後通過start()方法提交給cpu執行

多線程的實現方式二:線程類通過重寫run()方法實現Runnable接口,通過該線程類創建的對象來創建Thread對象,通過Thread對象的start()方法提交給cpu執行

備註:Thread類也是也是實現了Runnable接口,並且定義了start()方法,因此即使採用方式二,仍需通過Thread對象的start()方法來提交runnable的run()方法做執行。Thread實現方式更簡單,但通過實現Runnable接口的方式卻可以實現多接口繼承,允許同時繼承其它接口或繼承其它類。

線程優先級

Thread基類定義了final類型的setPriority(int newPriority)方法,該方法的參數是線程的優先級,默認爲5,係數範圍是[1,10]。

線程類創建對象後,對象可以調用Thread基類的setPriority方法來調整該對象的優先級。

線程計數器

在main和線程類中分別定義一個CountDownLatch對象,前者是實參,後者是形參。在線程類中,可以通過構造函數或set方法傳入CountDownLatch對象。實參定義需構造對象,形參只要定義類型即可。

CountDownLatch latch=new CountDownLatch(10);

線程類中,CountDownLatch對象latch的countDown()方法會使latch的值減1。

主程序中,CountDownLatch對象的await()或await(long time,TimeUnit unit)方法會等待計數器latch爲0。

分頁算法

int pageCount;
int total=10000;
int page=100;
if(total%page==0){
    pageCount=total/page;
}else{
    pageCount=total/page+1;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章