亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

圖文詳解Java線程和線程池

 更新時間:2021年11月08日 15:19:04   作者:weixin_40271838  
下面小編就為大家?guī)硪黄斦凧ava的線程和線程池。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、什么是線程,線程和進程的區(qū)別是什么

程序執(zhí)行流的最小執(zhí)行單位,是行程中的實際運作單位,經常容易和進程這個概念混淆。那么,線程和進程究竟有什么區(qū)別呢?首先,進程是一個動態(tài)的過程,是一個活動的實體。簡單來說,一個應用程序的運行就可以被看做是一個進程,而線程,是運行中的實際的任務執(zhí)行者??梢哉f,進程中包含了多個可以同時運行的線程。

二、線程中的基本概念,線程的生命周期


第一步,是用new Thread()的方法新建一個線程,在線程創(chuàng)建完成之后,線程就進入了就緒(Runnable)狀態(tài),此時創(chuàng)建出來的線程進入搶占CPU資源的狀態(tài),當線程搶到了CPU的執(zhí)行權之后,線程就進入了運行狀態(tài)(Running),當該線程的任務執(zhí)行完成之后或者是非常態(tài)的調用的stop()方法之后,線程就進入了死亡狀態(tài)。而我們在圖解中可以看出,線程還具有一個則色的過程,這是怎么回事呢?當面對以下幾種情況的時候,容易造成線程阻塞,第一種,當線程主動調用了sleep()方法時,線程會進入則阻塞狀態(tài),除此之外,當線程中主動調用了阻塞時的IO方法時,這個方法有一個返回參數,當參數返回之前,線程也會進入阻塞狀態(tài),還有一種情況,當線程進入正在等待某個通知時,會進入阻塞狀態(tài)。那么,為什么會有阻塞狀態(tài)出現(xiàn)呢?我們都知道,CPU的資源是十分寶貴的,所以,當線程正在進行某種不確定時長的任務時,Java就會收回CPU的執(zhí)行權,從而合理應用CPU的資源。我們根據圖可以看出,線程在阻塞過程結束之后,會重新進入就緒狀態(tài),重新?lián)寠ZCPU資源。這時候,我們可能會產生一個疑問,如何跳出阻塞過程呢?又以上幾種可能造成線程阻塞的情況來看,都是存在一個時間限制的,當sleep()方法的睡眠時長過去后,線程就自動跳出了阻塞狀態(tài),第二種則是在返回了一個參數之后,在獲取到了等待的通知時,就自動跳出了線程的阻塞過程

三、單線程和多線程

單線程,顧名思義即是只有一條線程在執(zhí)行任務,這種情況在我們日常的工作學習中很少遇到,所以我們只是簡單做一下了解

多線程,創(chuàng)建多條線程同時執(zhí)行任務,這種方式在我們的日常生活中比較常見。但是,在多線程的使用過程中,還有許多需要我們了解的概念。比如,在理解上并行和并發(fā)的區(qū)別,以及在實際應用的過程中多線程的安全問題,對此,我們需要進行詳細的了解。

并行和并發(fā):在我們看來,都是可以同時執(zhí)行多種任務,那么,到底他們二者有什么區(qū)別呢?

并發(fā),從宏觀方面來說,并發(fā)就是同時進行多種時間,實際上,這幾種時間,并不是同時進行的,而是交替進行的,而由于CPU的運算速度非常的快,會造成我們的一種錯覺,就是在同一時間內進行了多種事情

而并發(fā),則是真正意義上的同時進行多種事情。這種只可以在多核CPU的基礎下完成。

還有就是多線程的安全問題?為什么會造成多線程的安全問題呢?我們可以想象一下,如果多個線程同時執(zhí)行一個任務,name意味著他們共享同一種資源,由于線程CPU的資源不一定可以被誰搶占到,這是,第一條線程先搶占到CPU資源,他剛剛進行了第一次操作,而此時第二條線程搶占到了CPU的資源,name,共享資源還來不及發(fā)生變化,就同時有兩條數據使用了同一條資源,具體請參考多線程買票問題。這個問題我們應該如何解決那?

  有造成問題的原因我們可以看出,這個問題主要的矛盾在于,CPU的使用權搶占和資源的共享發(fā)生了沖突,解決時,我們只需要讓一條線程戰(zhàn)歌了CPU的資源時,阻止第二條線程同時搶占CPU的執(zhí)行權,在代碼中,我們只需要在方法中使用同步代碼塊即可。在這里,同步代碼塊不多進行贅述,可以自行了解。

四,線程池的原理解析

又以上介紹我們可以看出,在一個應用程序中,我們需要多次使用線程,也就意味著,我們需要多次創(chuàng)建并銷毀線程。而創(chuàng)建并銷毀線程的過程勢必會消耗內存。而在Java中,內存資源是及其寶貴的,所以,我們就提出了線程池的概念。

線程池:Java中開辟出了一種管理線程的概念,這個概念叫做線程池,從概念以及應用場景中,我們可以看出,線程池的好處,就是可以方便的管理線程,也可以減少內存的消耗。

那么,我們應該如何創(chuàng)建一個線程池那?Java中已經提供了創(chuàng)建線程池的一個類:Executor

而我們創(chuàng)建時,一般使用它的子類:ThreadPoolExecutor.

public ThreadPoolExecutor(int corePoolSize,  

   int maximumPoolSize,  
 
   long keepAliveTime,  

   TimeUnit unit,  

   BlockingQueue<Runnable> workQueue,  

   ThreadFactory threadFactory,  

   RejectedExecutionHandler handler)

這是其中最重要的一個構造方法,這個方法決定了創(chuàng)建出來的線程池的各種屬性,下面依靠一張圖來更好的理解線程池和這幾個參數:


又圖中,我們可以看出,線程池中的corePoolSize就是線程池中的核心線程數量,這幾個核心線程,只是在沒有用的時候,也不會被回收,maximumPoolSize就是線程池中可以容納的最大線程的數量,而keepAliveTime,就是線程池中除了核心線程之外的其他的最長可以保留的時間,因為在線程池中,除了核心線程即使在無任務的情況下也不能被清除,其余的都是有存活時間的,意思就是非核心線程可以保留的最長的空閑時間,而util,就是計算這個時間的一個單位,workQueue,就是等待隊列,任務可以儲存在任務隊列中等待被執(zhí)行,執(zhí)行的是FIFIO原則(先進先出)。threadFactory,就是創(chuàng)建線程的線程工廠,最后一個handler,是一種拒絕策略,我們可以在任務滿了知乎,拒絕執(zhí)行某些任務。

線程池的執(zhí)行流程又是怎樣的呢?


有圖我們可以看出,任務進來時,首先執(zhí)行判斷,判斷核心線程是否處于空閑狀態(tài),如果不是,核心線程就先就執(zhí)行任務,如果核心線程已滿,則判斷任務隊列是否有地方存放該任務,若果有,就將任務保存在任務隊列中,等待執(zhí)行,如果滿了,在判斷最大可容納的線程數,如果沒有超出這個數量,就開創(chuàng)非核心線程執(zhí)行任務,如果超出了,就調用handler實現(xiàn)拒絕策略。

handler的拒絕策略有四種:

  • AbortPolicy:不執(zhí)行新任務,直接拋出異常,提示線程池已滿
  • DisCardPolicy:不執(zhí)行新任務,也不拋出異常
  • DisCardOldSetPolicy:將消息隊列中的第一個任務替換為當前新進來的任務執(zhí)行
  • CallerRunsPolicy:直接調用execute來執(zhí)行當前任務

五,常見的幾種線程池的特點以及各自的應用場景

CachedThreadPool:可緩存的線程池,該線程池中沒有核心線程,非核心線程的數量為Integer.max_value,就是無限大,當有需要時創(chuàng)建線程來執(zhí)行任務,沒有需要時回收線程,適用于耗時少,任務量大的情況。

SecudleThreadPool:周期性執(zhí)行任務的線程池,按照某種特定的計劃執(zhí)行線程中的任務,有核心線程,但也有非核心線程,非核心線程的大小也為無限大。適用于執(zhí)行周期性的任務。

SingleThreadPool:只有一條線程來執(zhí)行任務,適用于有順序的任務的應用場景。

FixedThreadPool:定長的線程池,有核心線程,核心線程的即為最大的線程數量,沒有非核心線程

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Java冒泡排序簡單實現(xiàn)

    Java冒泡排序簡單實現(xiàn)

    這篇文章主要介紹了Java冒泡排序簡單實現(xiàn),具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 深入了解MyBatis參數

    深入了解MyBatis參數

    今天小編就為大家分享一篇關于深入了解MyBatis參數,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java設計模式之橋接模式的實現(xiàn)

    Java設計模式之橋接模式的實現(xiàn)

    今天給大家?guī)淼奈恼率荍ava設計模式的相關知識點,文中對橋接模式作了非常詳細的介紹及代碼示例,對正在學習的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • mybatis plus CU自動填充 和 軟刪除自動填充的實現(xiàn)方法

    mybatis plus CU自動填充 和 軟刪除自動填充的實現(xiàn)方法

    這篇文章主要介紹了mybatis plus CU自動填充 和 軟刪除自動填充的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Java使用數組實現(xiàn)ArrayList的動態(tài)擴容的方法

    Java使用數組實現(xiàn)ArrayList的動態(tài)擴容的方法

    這篇文章主要介紹了Java使用數組實現(xiàn)ArrayList的動態(tài)擴容的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 利用Java實現(xiàn)在PDF中添加工具提示

    利用Java實現(xiàn)在PDF中添加工具提示

    這篇文章主要介紹了如何通過Java在PDF中添加工具提示,文中的示例代碼講解詳細,對我們學習或工作有一定的參考價值,感興趣的可以學習一下
    2022-01-01
  • swing中Tree與滾動條用法實例分析

    swing中Tree與滾動條用法實例分析

    這篇文章主要介紹了swing中Tree與滾動條用法,以實例形式分析了java基于swing實現(xiàn)圖形界面的使用技巧,需要的朋友可以參考下
    2015-09-09
  • Java swing實現(xiàn)支持錄音等功能的鋼琴程序

    Java swing實現(xiàn)支持錄音等功能的鋼琴程序

    這篇文章主要為大家詳細介紹了Java swing實現(xiàn)鋼琴程序,支持錄音等功能的Java鋼琴源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • mybatis簡單resultMap使用詳解

    mybatis簡單resultMap使用詳解

    resultMap是Mybatis最強大的元素,它可以將查詢到的復雜數據(比如查詢到幾個表中數據)映射到一個結果集當中。這篇文章主要介紹了mybatis簡單resultMap使用詳解的相關資料,需要的朋友可以參考下
    2021-04-04
  • Retrofit+RxJava實現(xiàn)帶進度條的文件下載

    Retrofit+RxJava實現(xiàn)帶進度條的文件下載

    這篇文章主要為大家詳細介紹了Retrofit+RxJava實現(xiàn)帶進度條的文件下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論