java基本知識(一)

線程

1、在集合框架中,有些類是線程安全的。

  • vector:比arraylist多了個同步化機制(線程安全),因爲效率較低,現在已經不太建議使用。在web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。
  • tatck:堆棧類,先進後出
  • hashtable:就比hashmap多了個線程安全
  • enumeration:枚舉,相當於迭代器

2、實現線程兩種方法以及區別。

  • 通過繼承Thread類方式實現。
  • 通過實現Runnable接口方式實現。

兩種方法都需要通過Thread類的實例調用start()方法來開始線程的執行,start()方法通過java虛擬機調用線程中定義的run方法來執行該線程。

區別:

因爲java的單繼承特性,如果用繼承Thread類的方式來實現多線程的話,此線程類就不能繼承其他的類了。所以在程序中往往要求用實現Runnable的方式來開發會更好。第二也是最重要的一點就是,通過實現Runnable接口的方式可以達到資源共享的效果。

3、線程安全關鍵字synchronized

可以修飾函數、函數內語句。無論它加上方法還是對象上,它取得的鎖都是對象,而不是把一段代碼或是函數當作鎖。從而保證一段時間只能有一個線程得到執行,而另一個線程只有等當前線程執行完以後才能執行這塊代碼。

4、線程池

如果併發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因爲頻繁創建線程和銷燬線程需要時間。Java中可以通過線程池使得線程可以複用,就是執行完一個任務,並不被銷燬,而是可以繼續執行其他的任務。

其核心的ThreadPoolExecutor類中有幾個參數如下:

    • corePoolSize:核心池的大小,這個參數跟線程池的實現原理有非常大的關係。
    • maximumPoolSize:線程池最大線程數,這個參數也是一個非常重要的參數,它表示在線程池中最多能創建多少個線程;
    • keepAliveTime:表示線程沒有任務執行時最多保持多久時間會終止。

處理線程池的四點:

    • 如果當前線程池中的線程數目小於corePoolSize,則每來一個任務,就會創建一個線程去執行這個任務;
    • 如果當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中,若添加成功,則該任務會等待空閒線程將其取出去執行;若添加失敗(一般來說是任務緩存隊列已滿),則會嘗試創建新的線程去執行這個任務;
    • 如果當前線程池中的線程數目達到maximumPoolSize,則會採取任務拒絕策略進行處理;
    • 如果線程池中的線程數量大於 corePoolSize時,如果某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;如果允許爲核心池中的線程設置存活時間,那麼核心池中的線程空閒時間超過keepAliveTime,線程也會被終止。

ThreadPoolExecutor提供了兩個方法,用於線程池的關閉,分別是shutdown()(不會立即終止線程池,而是要等所有任務緩存隊列中的任務都執行完後才終止,但再也不會接受新的任務)和shutdownNow()(立即終止線程池,並嘗試打斷正在執行的任務,並且清空任務緩存隊列,返回尚未執行的任務)。

ThreadPoolExecutor提供了動態調整線程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()。

在ThreadPoolExecutor類中有兩個非常重要的方法:

1、execute()
是Executor中聲明的方法,在ThreadPoolExecutor進行了具體的實現,這個方法是ThreadPoolExecutor的核心
方法,通過這個方法可以向線程池提交一個任務,交由線程池去執行。
2、submit()
在ExecutorService中聲明的方法,在AbstractExecutorService就已經有了具體的實現,在
ThreadPoolExecutor中並沒有對其進行重寫,這個方法也是用來向線程池提交任務的,但是它和execute()方
法不同,它能夠返回任務執行的結果。



發佈了47 篇原創文章 · 獲贊 95 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章