【Java面試系列】JUC-01 線程入門&如何創(chuàng)建線程


文本主要講3個問題:
線程是什么?
線程有哪些狀態(tài)?各狀態(tài)間的轉換了解嗎?
創(chuàng)建線程的3種方法你都了解嗎?
備注:如果不方便看文章,可以直接去看我的視頻,抖音搜索【程序員一棵樹】。
1. 線程是什么?
要介紹線程,我們首先需要知道什么是進程。
進程:進程是一個具有一定獨立功能的程序在一個數據集合上依次動態(tài)執(zhí)行的過程。是一個正在執(zhí)行的程序的實例,包括程序計數器、寄存器和程序變量的當前值等。
在介紹完進程以后,我們再來看一下更細粒度的線程。
線程:線程是進程中執(zhí)行運算的最小單位,是進程中的一個實體,是被系統(tǒng)獨立調度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤銷另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。
下圖直觀展示了一下線程和進程的關系。

2. 線程各狀態(tài)間的轉換你了解嗎?
首先,我們需要知道線程都有哪些狀態(tài)。
線程有如下6個狀態(tài):1. 初始、2. 等待、3. 超時等待、4.運行(運行中、就緒)、5. 終止、6. 阻塞。(有時候會把運行中和就緒單獨拿出來,此時就會有7種狀態(tài))
下面,我們通過一張圖來展示各狀態(tài)間的轉換。

? 狀態(tài)流轉圖
這里我們選幾個比較常見的動作簡要說明一下,
Sleep: 是簡單的線程睡眠。 public static native void sleep(long millis) throws InterruptedException;
Yiled:從CPU上先離開,先讓出一下,返回就緒狀態(tài)。進入等待隊列再等調度進行調用,不管后面其他線程能不能搶到;
Join:將其他線程加入進來,等加進來的運行完再運行(sleep再久也沒用),一般用來按順序
wait() 和 notify()是Object類的,等待,通知。
3. 創(chuàng)建建線程的3種方法你都了解嗎?
繼承Thread類。
實現(xiàn)Runnable。
使用Callable和FutureTask創(chuàng)建線程。
創(chuàng)建線程池 ThreadPoolExecutor。


main函數

執(zhí)行結果:

對于線程池,我們這里簡單介紹下ThreadPoolExecutor及其參數,因為它是Executors創(chuàng)建線程池的底層實現(xiàn)。(注意:ThreadPoolExecutor我們會在后續(xù)文章會對這塊有詳細展開,本文既然提到了就簡單講一下入參)
下圖是ThreadPoolExecutor原始構造函數的JDK源碼截圖,這也是面試中最常會被問到,同時也是我們日常開發(fā)需要掌握的一個構造函數。下面我們對它的7個構造函數進行簡要的介紹。

corePoolSize – the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set (核心線程數。一直存在的,可供線程池使用的線程數量,可以理解為不會下線的常用工)
maximumPoolSize – the maximum number of threads to allow in the pool (最大線程數。線程池中線程數的上限。)
keepAliveTime – when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. (非核心線程外的線程最大空閑時間??臻e時間超過該時間則線程銷毀)
unit – the time unit for the keepAliveTime argument (最大空閑等待時間的時間單位)
workQueue – the queue to use for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method. (阻塞隊列。用于存放暫時無法被執(zhí)行的任務)
threadFactory – the factory to use when the executor creates a new thread (線程工廠。線程池的線程都由該工廠創(chuàng)建)
handler – the handler to use when execution is blocked because the thread bounds and queue capacities are reached(任務拒絕處理器。用于處理阻塞隊列滿時,無法加入到阻塞隊列中的任務)
好了,本期的文章就到這里。更多更精彩的內容請關注。
? ? ? ? V信公眾號搜索? ?“程序員一棵樹”。 內有相關文檔原文和免費資料。
? ? ? ? D音搜索? ? ? ? ? ? ?“程序員一棵樹”。
? ? ? ? B站搜索? ? ? ? ? ? ?“程序員一棵樹”。