Java線程的全方位詳解
❤️大家好,我是賈斯汀,今天主要聊一聊關(guān)于線程的瓜!❤️
先來(lái)看一下線程這張圖線程的幾種運(yùn)行狀態(tài)之間運(yùn)行流程:
看不懂沒(méi)關(guān)系,慢慢來(lái)學(xué)習(xí),往下學(xué)習(xí)來(lái)繼續(xù)了解一下~
什么是線程?
- 線程是進(jìn)程的一部分,是程序執(zhí)行中的一條執(zhí)行路線;
- 進(jìn)程就是指程序在其自身地址空間的一次執(zhí)行活動(dòng),是程序獨(dú)立運(yùn)行的基本單位;
- 一個(gè)進(jìn)程可以包含多條線程,一個(gè)條線程對(duì)應(yīng)一個(gè)進(jìn)程中的一條執(zhí)行路線。
線程的幾種創(chuàng)建方式?
主要由四種方式創(chuàng)建線程:
- 方式1:繼承Thread類,重寫run(),無(wú)返回值
- 方式2:實(shí)現(xiàn)Runnable接口,重寫run(),無(wú)返回值
- 方式3:新建FutureTask + 實(shí)現(xiàn)Callable接口,重寫call(),有返回值
- 方式4:通過(guò)Executors工具類創(chuàng)建線程池 + 調(diào)用submit + 重寫Callable接口,重寫call(),有返回值
具體每一種創(chuàng)建方式說(shuō)明及代碼實(shí)現(xiàn)如下:
/** * 創(chuàng)建Thread線程的四種方式之內(nèi)部類寫法 */ public class NewThread { public static void main(String[] args) throws Exception { //方式1 Thread t1 = new Thread(){ @Override public void run() { System.out.println("方式1:繼承Thread類并重寫run()方法創(chuàng)建線程,無(wú)返回值"); } }; t1.start(); Thread.sleep(1000); //方式2 Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("方式2:實(shí)現(xiàn)Runnable接口并重寫run()方法創(chuàng)建線程,無(wú)返回值"); } }); t2.start(); Thread.sleep(1000); //方式3 FutureTask<String> ft = new FutureTask<>(new Callable<String>() { @Override public String call() throws Exception { String result = "方式3:實(shí)現(xiàn)Callable接口并重寫call()方法新建FutureTask對(duì)象作為new Thread實(shí)例化參數(shù)創(chuàng)建線程,有返回值"; return result; } }); Thread t3 = new Thread(ft); t3.start(); System.out.println(ft.get()); //輸出返回值 Thread.sleep(1000); //方式4 ExecutorService pool = Executors.newFixedThreadPool(5); Future<String> future = pool.submit(new Callable<String>(){ @Override public String call() throws Exception { String result = "方式4:通過(guò)工具類Executors創(chuàng)建線程池,調(diào)用submit新建Future對(duì)象并重寫Callable接口重寫call()方法創(chuàng)建線程,有返回值"; return result; } }); pool.shutdown();//關(guān)閉線程池 System.out.println(future.get()); //輸出返回值 } }
線程的幾種狀態(tài)?
- 新建(new):通過(guò)上面介紹的某種方式新建線程即處于新建狀態(tài);
- 就緒(Ready):調(diào)用線程的start()方法,首先進(jìn)入就緒狀態(tài),等待獲取CPU時(shí)間;
- 運(yùn)行(Running):就緒狀態(tài)的線程獲取到CPU時(shí)間或阻塞狀態(tài)的線程恢復(fù)都可進(jìn)入運(yùn)行狀態(tài);
- 阻塞(Blocked):運(yùn)行狀態(tài)的線程可能因?yàn)镮O阻塞或在synchronized同步代碼塊中都可進(jìn)入阻塞狀態(tài);
- 死亡(Dead):正常運(yùn)行的線程執(zhí)行結(jié)束或就緒狀態(tài)的線程直接調(diào)用stop()方法就會(huì)進(jìn)入死亡狀態(tài);
- 睡眠(Sleeping):調(diào)用sleep方法指定線程睡眠多久,會(huì)釋放CPU資源,但不釋放鎖資源,睡眠時(shí)間到后會(huì)重新進(jìn)入就緒狀態(tài);
- 等待(Waiting):調(diào)用wait會(huì)讓線程短暫的處于等待中,會(huì)釋放CPU資源,并且釋放鎖資源,進(jìn)入就緒狀態(tài)。
線程相關(guān)的核心方法及作用?
- start:調(diào)用start()方法底層源碼會(huì)判斷線程狀態(tài)是否是新建狀態(tài),不是則直接拋異常,并且后續(xù)會(huì)調(diào)用一個(gè)native本地方法start0,其底層通過(guò)JVM來(lái)進(jìn)行調(diào)度最后調(diào)用run()方法執(zhí)行;
- run:調(diào)用run()方法,底層會(huì)直接進(jìn)入到重寫的run()方法并執(zhí)行代碼塊內(nèi)容;
- sleep:屬于Thread類的一個(gè)native本地static靜態(tài)方法,可以在任何地方調(diào)用sleep(1000)方法,期間會(huì)讓當(dāng)前線程進(jìn)入睡眠狀態(tài)1秒鐘,并讓出CPU資源,但不釋放鎖資源
- wait:屬于Object類的一個(gè)方法,只能在synchronized同步塊中進(jìn)行調(diào)用wait(1000)方法,期間會(huì)讓當(dāng)前線程進(jìn)入等待狀態(tài)1秒鐘,不僅會(huì)讓出CPU時(shí)間,還釋放并釋放對(duì)象鎖資源
- yield:跟sleep一樣,也是Thread類的一個(gè)native本地static靜態(tài)方法,與sleep的最大區(qū)別在于Thread.yield()不需要指定暫停時(shí)間,并不會(huì)阻塞線程,而是進(jìn)入就緒狀態(tài),短暫的讓出CPU資源,這份CPU資源可能自己會(huì)再次獲取到,這個(gè)取決于調(diào)度器;
- notify:同wait一樣,也是屬于Object類的一個(gè)方法,作用是可以將wait()后等待的線程進(jìn)行單個(gè)喚醒,并進(jìn)入Read就緒狀態(tài);
- notifyAll:同notify一樣,也是屬于Object類的一個(gè)方法,作用將當(dāng)前對(duì)象上的所有等待線程喚醒,并進(jìn)入Read就緒狀態(tài);
- stop:該方法已被廢棄,不建議使用,該方法的作用是直接將線程結(jié)束,進(jìn)入死亡狀態(tài);
- interrupt:沖斷線程,不保證線程進(jìn)入死亡、就緒還是繼續(xù)運(yùn)行,不想stop可以直接沖斷一個(gè)正在運(yùn)行的線程。 What's up!不來(lái)個(gè)點(diǎn)贊支持一下,這手指是金子做的?
到此這篇關(guān)于Java線程的全方位詳解的文章就介紹到這了,更多相關(guān)Java 線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC?bean加載控制的實(shí)現(xiàn)分析
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web?MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開(kāi)發(fā)2023-02-02基于Mybatis plus 自動(dòng)代碼生成器的實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了基于Mybatis-plus 自動(dòng)代碼生成器的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05Java實(shí)現(xiàn)的百度語(yǔ)音識(shí)別功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的百度語(yǔ)音識(shí)別功能,較為簡(jiǎn)明扼要的分析了Java調(diào)用百度語(yǔ)音接口相關(guān)操作步驟,并給出了具體的語(yǔ)音識(shí)別用法代碼示例,需要的朋友可以參考下2018-08-08java?工作流引擎設(shè)計(jì)實(shí)現(xiàn)解析流程定義文件
這篇文章主要為大家介紹了java?工作流引擎設(shè)計(jì)與實(shí)現(xiàn)及流程定義文件解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05SpringBoot?Redis清除所有的key的實(shí)現(xiàn)方法
本文主要介紹了SpringBoot?Redis清除所有的key的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Java操作MongoDB數(shù)據(jù)庫(kù)的示例代碼
這篇文章主要介紹了Java操作MongoDB的示例代碼,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04Java 8新的時(shí)間日期庫(kù)的20個(gè)使用示例
這篇文章主要介紹了Java 8新的時(shí)間日期庫(kù)的20個(gè)使用示例,需要的朋友可以參考下2015-04-04mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫(kù)字段加密脫敏
這篇文章主要為大家介紹了mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫(kù)字段加密脫敏,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09