專欄簡(jiǎn)介: JavaEE從入門到進(jìn)階
題目來源: leetcode,牛客,劍指offer.
創(chuàng)作目標(biāo): 記錄學(xué)習(xí)JavaEE學(xué)習(xí)歷程
希望在提升自己的同時(shí),幫助他人,,與大家一起共同進(jìn)步,互相成長(zhǎng).
學(xué)歷代表過去,能力代表現(xiàn)在,學(xué)習(xí)能力代表未來!?
認(rèn)識(shí)線程(Thread)
1. 線程是什么?
2. 為什么要有線程?
3. 線程和進(jìn)程的區(qū)別?
4. Java線程和操作系統(tǒng)線程的關(guān)系?
5. 創(chuàng)建多線程
6. 使用JConsole 查看線程狀態(tài)
一個(gè)線程就是一個(gè)執(zhí)行流 , 每個(gè)線程都可以按照自己的順序來執(zhí)行代碼 , 多個(gè)線程同時(shí)執(zhí)行著多份代碼.
例如: 一家公司的會(huì)計(jì)張三去銀行辦理業(yè)務(wù) , 業(yè)務(wù)范疇很廣 , 有財(cái)務(wù)轉(zhuǎn)賬 , 社保繳納 , 員工福利發(fā)放. 如果只有張三一個(gè)會(huì)計(jì) , 就會(huì)耗費(fèi)很長(zhǎng)的時(shí)間. 為了節(jié)省時(shí)間 , 公司張三又叫來了李四和王五 , 三個(gè)人分別排隊(duì)叫號(hào) , 自此就有三個(gè)執(zhí)行流共同完成任務(wù) , 但本質(zhì)上他們還是辦理同一家公司的業(yè)務(wù) . 此時(shí)我們就把這種情況稱為多線程 , 將一個(gè)大任務(wù)分成多個(gè)小任務(wù) , 交給不同執(zhí)行流分別排隊(duì)執(zhí)行.其中李四和王五是張三叫來的 , 那么張三就是主線程.(Main Thread).
首先 , "并發(fā)編程" 成為 "剛需".
- 單核CPU的發(fā)展遇到了瓶頸 , 想要提高算力 , 需要使用多核CPU. 而并發(fā)編程恰好能更充分的利用多核CPU資源.
- 有些任務(wù)常見需要等待"IO" , 為了讓程序在等待"IO"的同時(shí)做一些其他工作 , 也需要用到并發(fā)編程.
其次 , 雖然多進(jìn)程能實(shí)現(xiàn)并發(fā)編程 , 但線程比進(jìn)程更輕量.
- 創(chuàng)建線程比進(jìn)程更快
- 調(diào)度線程比進(jìn)程更快
- 銷毀線程比進(jìn)程更快
Tips:雖然線程比進(jìn)程更輕量 , 但人們并不滿足于此 , 于是有了"線程池"(Thread Pool)和協(xié)程(Coroutine)
維度 | 多進(jìn)程 | 多線程 | 總結(jié) |
數(shù)據(jù)共享 , 同步 | 數(shù)據(jù)是分開的 , 共享復(fù)雜; 同步簡(jiǎn)單. | 多線程共享進(jìn)程數(shù)據(jù) , 共享簡(jiǎn)單; 同步復(fù)雜 | 各有優(yōu)勢(shì) |
內(nèi)存, CPU | 占用內(nèi)存多 ,?CPU利用率低 | 占用內(nèi)存少 ,?CPU利用率高 | 線程占優(yōu) |
創(chuàng)建銷毀, 切換 | 創(chuàng)建銷毀 , 切換復(fù)雜 , 速度慢 | 創(chuàng)建銷毀 , 切換簡(jiǎn)單 , 速度快 | 線程占優(yōu) |
編程調(diào)試 | 編程簡(jiǎn)單 , 調(diào)試簡(jiǎn)單 | 編程復(fù)雜 , 調(diào)試復(fù)雜 | 進(jìn)程占優(yōu) |
可靠性 | 進(jìn)程間不會(huì)相互影響 | 一個(gè)線程掛掉將導(dǎo)致 整個(gè)進(jìn)程掛掉 | 進(jìn)程占優(yōu) |
分布式 | 適用于多核 , 多機(jī)分布; 如果一臺(tái)機(jī)器不夠 ,? 擴(kuò)展到多臺(tái)機(jī)器比較簡(jiǎn)單 | 適用于多核分布 | 線程占優(yōu) |
- 進(jìn)程包含線程 , 每個(gè)進(jìn)程中至少有一個(gè)線程存在 , 即主線程.
- 進(jìn)程和進(jìn)程之間不共享內(nèi)存空間 , 同一個(gè)進(jìn)程的多個(gè)線程之間共用進(jìn)程的同一份資源.(內(nèi)存和文件描述符表)
- 進(jìn)程是系統(tǒng)分配資源的最小單位 , 線程是系統(tǒng)調(diào)度的最小單位.
還是之前的例子 , 每個(gè)來銀行辦理業(yè)務(wù)的客戶相當(dāng)于一個(gè)進(jìn)程?, 他們的票據(jù)肯定不同 , 否則銀行卡中的錢就被別人取走了 , 而張三李四王五雖然是三個(gè)不同的執(zhí)行流 , 但辦理的都是同一家公司的業(yè)務(wù) , 所以票據(jù)是共享的 , 這就是多線程和多進(jìn)程大的區(qū)別.
線程是操作系統(tǒng)中的概念 , 操作系統(tǒng)內(nèi)核實(shí)現(xiàn)了線程這樣的機(jī)制 , 并且提供了一系列的API供用戶層使用 , 例如Linux系統(tǒng)的pthread庫.
Java標(biāo)準(zhǔn)庫中的Thread類可以看做是對(duì)操作系統(tǒng)提供的線程API做進(jìn)一步的抽象和封裝.
1) 繼承Thread重寫run()
t.start 真正創(chuàng)建了一個(gè)線程 , 線程是獨(dú)立的執(zhí)行流. run()?只是描述了線程要執(zhí)行的任務(wù)是什么 ,?
class MyThread extends Thread{
@Override
public void run(){
System.out.println("Hello thread");
}
}
public static void main(String[] args) {
Thread t = new MyThread();
t.start();//start 創(chuàng)建了一個(gè)新的線程 , 新的線程負(fù)責(zé)執(zhí)行t.run().
System.out.println("Hello main");
}
2) 實(shí)現(xiàn)Runnable()
將任務(wù)與線程區(qū)分開來,讓線程和任務(wù)之間解耦合.(低耦合) 好處是如果后期要改成多進(jìn)程 , 或者線程池 , 或者協(xié)程.....此時(shí)代碼改動(dòng)比較小.
class MyRunnable implements Runnable {
//Runnable 作用 , 描述一個(gè)"要執(zhí)行的任務(wù)" , run 方法就是任務(wù)執(zhí)行的細(xì)節(jié).
@Override
public void run() {
System.out.println("Hello Thread");
}
}
public static void main(String[] args) {
//描述一個(gè)任務(wù)
Runnable runnable = new MyRunnable();
//把任務(wù)交給線程來執(zhí)行
Thread t = new Thread(runnable);
t.start();
}
3) 使用匿名內(nèi)部類
new Thread 創(chuàng)建了 Thread 類的子類 , 因?yàn)樽宇悰]有名字叫匿名匿名內(nèi)部類 , 并且讓 t 引用指向該實(shí)例.
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run(){
System.out.println("Hello thread");
}
};
t.start();
}
4) 使用匿名內(nèi)部類實(shí)現(xiàn)Runnable()
該方法與第二種方法本質(zhì)相同. 只不過把實(shí)現(xiàn) Runnable 的任務(wù)交給匿名內(nèi)部類.最后將匿名內(nèi)部類的實(shí)例交給 Thread 類的構(gòu)造方法.
public static void main4(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello thread");
}
});
t.start();
}
5)j簡(jiǎn)便寫法 Lambda表達(dá)式
直接把 lambda 傳給Thread 構(gòu)造方法.
public static void main5(String[] args) {
Thread t = new Thread(()->{
System.out.println("Hello world");
});
t.start();
}
6. 使用JConsole 查看線程狀態(tài)JConsole 是 jdk 自帶的一種基于JMX的可視化監(jiān)控 , 管理工具.主要用于查看線程的狀態(tài).
打開 jdk 進(jìn)入bin目錄 , 找到 jconsole.
jconsole只能查看正在運(yùn)行的線程狀態(tài) , 我們先在本地 ideal 運(yùn)行一個(gè)多線程的Java程序.這時(shí)打開jconsole 找到我們創(chuàng)建的Java程序 , 點(diǎn)擊連接.
忽略不安全的連接提示 , 進(jìn)入線程專欄.
此時(shí)我們可以看到多個(gè)線程 , 其中main是主線程 , Thread-0是我們創(chuàng)建的另一個(gè)線程.其余線程都是JVM自帶的.
選擇指定的線程后 , 在堆棧跟蹤中就可以查看到線程調(diào)用棧具體的執(zhí)行細(xì)節(jié). 這對(duì)于后期多線程程序的調(diào)試工作有很大的用處.
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
新聞名稱:[JavaEE]線程與進(jìn)程的區(qū)別詳解-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://www.muchs.cn/article46/dgishg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航、云服務(wù)器、微信小程序、App開發(fā)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容