[JavaEE]線程與進(jìn)程的區(qū)別詳解-創(chuàng)新互聯(lián)

網(wǎng)站的建設(shè)成都創(chuàng)新互聯(lián)專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都假山制作等企業(yè)提供專業(yè)服務(wù)。

專欄簡(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)


認(rèn)識(shí)線程(Thread) 1. 線程是什么?

一個(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).


2. 為什么要有線程?

首先 , "并發(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)


3. 線程和進(jìn)程的區(qū)別?
維度多進(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ū)別.


4. Java線程和操作系統(tǒng)線程的關(guān)系?

線程是操作系統(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)一步的抽象和封裝.


5. 創(chuàng)建多線程

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)

外貿(mào)網(wǎng)站制作