摘要:每個(gè)進(jìn)程包含一到多個(gè)線程。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。因此此時(shí)可能有多個(gè)線程處于就緒狀態(tài)。
進(jìn)程和線程
每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。
使用線程可以把占據(jù)時(shí)間長(zhǎng)的程序中的任務(wù)放到后臺(tái)去處理,程序的運(yùn)行速度可能加快,在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。
如果有大量的線程,會(huì)影響性能,因?yàn)椴僮飨到y(tǒng)需要在它們之間切換,更多的線程需要更多的內(nèi)存空間,線程的中止需要考慮其對(duì)程序運(yùn)行的影響。通常塊模型數(shù)據(jù)是在多個(gè)線程間共享的,需要防止線程死鎖情況的發(fā)生。
總結(jié):進(jìn)程是所有線程的集合,每一個(gè)線程是進(jìn)程中的一條執(zhí)行路徑。
推薦閱讀:http://www.ruanyifeng.com/blo...
后臺(tái)發(fā)送郵件或者短信
文件下載
數(shù)據(jù)庫(kù)連接池
創(chuàng)建方式 繼承Thread類 重寫run方法MyThread:
public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("i = " + i); } } }
測(cè)試接口:
@GetMapping("test-my-thread") public void testMyThead() { MyThread myThread = new MyThread(); System.out.println("start thread"); myThread.start(); System.out.println("end thread"); }
測(cè)試結(jié)果:
start thread
end thread
循環(huán)i
Runnable接口,重寫run方法Mythread2
public class Mythread2 implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("i = " + i); } } }
測(cè)試接口
@GetMapping("test-my-thread2") public void testMyThead2() { Mythread2 mythread2 = new Mythread2(); System.out.println("start thread"); new Thread(mythread2).start(); System.out.println("end thread"); }
測(cè)試結(jié)果:
start thread
end thread
循環(huán)i
使用匿名內(nèi)部類方式測(cè)試接口
@GetMapping("test-my-thread3") public void testMyThead3() { new Thread(() -> { System.out.println("start thread"); for (int i = 0; i < 10; i++) { System.out.println("i = " + i); } System.out.println("end thread"); }).start(); }
測(cè)試結(jié)果:
start thread
end thread
循環(huán)i
常見問題繼承Thread?實(shí)現(xiàn)Runnable接口?
推薦使用實(shí)現(xiàn)Runnable接口,因?yàn)閖ava是單繼承多實(shí)現(xiàn)的
start方法?run方法?
start開啟線程,等待cpu去執(zhí)行;run是實(shí)例調(diào)用
Thread() 無參構(gòu)造
Thread(String name) 指定Thread名稱
Thread(Runable r) 參數(shù)為Runable
Thread(Runable r, String name) 參數(shù)為Runable和Thread名稱
Thread關(guān)于自身信息的APIsetName(String name)/getName() 讀寫線程名稱
isDaemon() 判斷該線程是否是守護(hù)線程
getId() 獲取當(dāng)前jvm中該線程的唯一標(biāo)示
isAlive() 判斷該線程是否存活,標(biāo)準(zhǔn)是線程已啟動(dòng)但還沒有執(zhí)行完畢
getState() 獲取該線程狀態(tài),返回值為枚舉,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED
currentThread() 獲取當(dāng)前線程對(duì)象
Thread關(guān)于執(zhí)行的APIstart() 啟動(dòng)線程
run() 實(shí)例方法執(zhí)行線程代碼,并沒有啟動(dòng)一個(gè)新的線程
join(long millis, int nanos) 保證指定時(shí)間以內(nèi),在JVM中只有該線程在運(yùn)行。millis是等待的毫秒數(shù),nanos是微秒數(shù)(參數(shù)可省)。如果millis填0,則一直等到當(dāng)前線程執(zhí)行完畢,JVM才會(huì)調(diào)度其他線程執(zhí)行
yield() 當(dāng)該線程讓出CPU,給其他線程一個(gè)獲取調(diào)度的機(jī)會(huì),但是不確保一定會(huì)調(diào)度到其他線程上
sleep(long millis, int nanos) 讓該線程在指定時(shí)間以內(nèi)休眠,需要注意的是在休眠過程中該線程不會(huì)釋放持有的鎖。millis是等待的毫秒數(shù),nanos是微秒數(shù)(參數(shù)可省)
Stop() 停止線程
多線程運(yùn)行狀態(tài) 新建狀態(tài)當(dāng)用new操作符創(chuàng)建一個(gè)線程時(shí), 例如new Thread(r),線程還沒有開始運(yùn)行,此時(shí)線程處在新建狀態(tài)。 當(dāng)一個(gè)線程處于新生狀態(tài)時(shí),程序還沒有開始運(yùn)行線程中的代碼就緒狀態(tài)
一個(gè)新創(chuàng)建的線程并不自動(dòng)開始運(yùn)行,要執(zhí)行線程,必須調(diào)用線程的start()方法。當(dāng)線程對(duì)象調(diào)用start()方法即啟動(dòng)了線程,start()方法創(chuàng)建線程運(yùn)行的系統(tǒng)資源,并調(diào)度線程運(yùn)行run()方法。當(dāng)start()方法返回后,線程就處于就緒狀態(tài)。 處于就緒狀態(tài)的線程并不一定立即運(yùn)行run()方法,線程還必須同其他線程競(jìng)爭(zhēng)CPU時(shí)間,只有獲得CPU時(shí)間才可以運(yùn)行線程。因?yàn)樵趩蜟PU的計(jì)算機(jī)系統(tǒng)中,不可能同時(shí)運(yùn)行多個(gè)線程,一個(gè)時(shí)刻僅有一個(gè)線程處于運(yùn)行狀態(tài)。因此此時(shí)可能有多個(gè)線程處于就緒狀態(tài)。對(duì)多個(gè)處于就緒狀態(tài)的線程是由Java運(yùn)行時(shí)系統(tǒng)的線程調(diào)度程序(thread scheduler)來調(diào)度的。運(yùn)行狀態(tài)
當(dāng)線程獲得CPU時(shí)間后,它才進(jìn)入運(yùn)行狀態(tài),真正開始執(zhí)行run()方法.阻塞狀態(tài)
線程運(yùn)行過程中,可能由于各種原因進(jìn)入阻塞狀態(tài): 1. 線程通過調(diào)用sleep方法進(jìn)入睡眠狀態(tài); 2. 線程調(diào)用一個(gè)在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會(huì)返回到它的調(diào)用者; 3. 線程試圖得到一個(gè)鎖,而該鎖正被其他線程持有; 4. 線程在等待某個(gè)觸發(fā)條件;死亡狀態(tài)
有兩個(gè)原因會(huì)導(dǎo)致線程死亡: 1) run方法正常退出而自然死亡, 2) 一個(gè)未捕獲的異常終止了run方法而使線程猝死。 為了確定線程在當(dāng)前是否存活著(就是要么是可運(yùn)行的,要么是被阻塞了),需要使用isAlive方法。如果是可運(yùn)行或被阻塞,這個(gè)方法返回true; 如果線程仍舊是new狀態(tài)且不是可運(yùn)行的, 或者線程死亡了,則返回false.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74118.html
摘要:基礎(chǔ)知識(shí)復(fù)習(xí)后端掘金的作用表示靜態(tài)修飾符,使用修飾的變量,在中分配內(nèi)存后一直存在,直到程序退出才釋放空間。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 Java 學(xué)習(xí)過程|完整思維導(dǎo)圖 - 后端 - 掘金JVM 1. 內(nèi)存模型( 內(nèi)存分為幾部分? 堆溢出、棧溢出原因及實(shí)例?線上如何排查?) 2. 類加載機(jī)制 3. 垃圾回收 Java基礎(chǔ) 什么是接口?什么是抽象...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...
摘要:多線程和并發(fā)問題是技術(shù)面試中面試官比較喜歡問的問題之一。線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。 多線程和并發(fā)問題是 Java 技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識(shí)來對(duì)應(yīng)日后碰到的問題。(...
摘要:在這個(gè)范圍廣大的并發(fā)技術(shù)領(lǐng)域當(dāng)中多線程編程可以說是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問題的構(gòu)思與解決都是基于多線程模型來進(jìn)行的。一般來說,多線程程序會(huì)面臨三類問題正確性問題效率問題死鎖問題。 多線程編程或者說范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯(cuò)的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險(xiǎn)艱辛地學(xué)習(xí)各種多線程編程技術(shù)、解決各種并發(fā)問題呢? 因?yàn)椴l(fā)是整個(gè)分布式集群的基礎(chǔ),通過分布式集群不僅可以大...
閱讀 782·2021-09-26 09:55
閱讀 2071·2021-09-22 15:44
閱讀 1480·2019-08-30 15:54
閱讀 1336·2019-08-30 15:54
閱讀 2681·2019-08-29 16:57
閱讀 526·2019-08-29 16:26
閱讀 2496·2019-08-29 15:38
閱讀 2132·2019-08-26 11:48