欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaEE的進(jìn)程,線程和創(chuàng)建線程的5種方式詳解

 更新時(shí)間:2022年03月30日 14:20:03   作者:見(jiàn)聞色霸氣~  
這篇文章主要為大家詳細(xì)介紹了JavaEE的進(jìn)程,線程和創(chuàng)建線程的5種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、認(rèn)識(shí)進(jìn)程、線程 

1.1什么是進(jìn)程

進(jìn)程process/task.“進(jìn)程"是計(jì)算機(jī)完成一個(gè)工作的"過(guò)程”

設(shè)備上一個(gè)正在運(yùn)行的程序,就是一個(gè)進(jìn)程。比如你打開(kāi)的QQ就是一個(gè)進(jìn)程,正在和別人聊天的微信也是一個(gè)進(jìn)程。進(jìn)程是系統(tǒng)進(jìn)行資源分配的基本單位。

當(dāng)我們打開(kāi)任務(wù)管理器就可以看到,當(dāng)前操作系統(tǒng)中正在運(yùn)行的進(jìn)程。

在這里插入圖片描述

要想讓一個(gè)進(jìn)程真正的運(yùn)行起來(lái),就需要給這個(gè)進(jìn)程分配一定的系統(tǒng)硬件資源。這些資源都包括:

CPU:例如我電腦中任務(wù)管理器占用了11%的CPU,QQ占用0.3%。

內(nèi)存:任務(wù)管理器占用了45.7MB。Microsoft Edge占用了320.0MB

磁盤(pán):qq使用的了0.2MB/秒。

網(wǎng)絡(luò)帶寬…

在舉一個(gè)例子:我是班長(zhǎng),老師想讓我組織一個(gè)活動(dòng),我要想組織這個(gè)活動(dòng),我就需要向老師申請(qǐng)一些活動(dòng)經(jīng)費(fèi)、人員調(diào)用。這里我就相當(dāng)于進(jìn)程。老師就是CPU。我組織活動(dòng)的時(shí)候向老師申請(qǐng)經(jīng)費(fèi)、人。就是在請(qǐng)求分配一些資源。有經(jīng)費(fèi),有人才能把活動(dòng)做好。

進(jìn)程的管理

管理=描述(PCB)+組織

進(jìn)程的組織:

使用一定的數(shù)據(jù)結(jié)構(gòu)來(lái)組織。常見(jiàn)的做法是用一雙向鏈表。 當(dāng)你查看進(jìn)程列表都有哪些進(jìn)程時(shí),本質(zhì)上就是遍歷操作系統(tǒng)內(nèi)核中的這個(gè)組織進(jìn)程的鏈表,再顯示出每個(gè)進(jìn)程的這些屬性。創(chuàng)建一個(gè)進(jìn)程,本質(zhì)上就是創(chuàng)建了一個(gè)PCB對(duì)象,把這個(gè)對(duì)象加入到內(nèi)核的鏈表中。銷(xiāo)毀一個(gè)進(jìn)程,本質(zhì)上就是把這個(gè)PCB對(duì)象從內(nèi)核鏈表中刪除。

進(jìn)程的描述:

PCB描述進(jìn)程。這個(gè)PCB實(shí)際上是一個(gè)非常大的結(jié)構(gòu)體,屬性有很多,例如:PID(下表第二列)、內(nèi)存指針、文件描述符表、進(jìn)程的狀態(tài)、上下文、優(yōu)先級(jí)、記賬信息等等。

PID: 一個(gè)進(jìn)程的身份標(biāo)識(shí),一個(gè)機(jī)器同一時(shí)刻每個(gè)進(jìn)程的PID是唯一的。

內(nèi)存指針: 描述這個(gè)進(jìn)程使用的內(nèi)存空間是哪個(gè)范圍

文件描述附表: 描述這個(gè)進(jìn)程都打開(kāi)了哪些文件

在這里插入圖片描述

進(jìn)程的調(diào)度

說(shuō)到進(jìn)程,就會(huì)涉及到進(jìn)程的調(diào)度,剛才可以看到我電腦上的進(jìn)程是非常多的,雖然應(yīng)用那里只顯示了5個(gè),但是后臺(tái)還是幫我運(yùn)行了87個(gè)進(jìn)程。相信大家的電腦一定沒(méi)有這么多CPU吧。CPU數(shù)目是少于進(jìn)程數(shù)目的,但是我又需要讓那些進(jìn)程“同時(shí)執(zhí)行”。我們的系統(tǒng)是支持多任務(wù)的系統(tǒng)。而這個(gè)多任務(wù)系統(tǒng)其實(shí)就是基于進(jìn)程調(diào)度這樣的機(jī)制來(lái)完成的。

并發(fā)式執(zhí)行

舉個(gè)例子:假設(shè)有小張同學(xué),他長(zhǎng)的很好看,在學(xué)校里有很多的追求者。 按正常男人的標(biāo)準(zhǔn),我同時(shí)只能和一個(gè)女生交往~

那小張同學(xué)有沒(méi)有辦法做到同時(shí)和多個(gè)女生交往呢? 小張同學(xué)前思后想,最終決定!安排一個(gè)時(shí)間表?。?!

周一早上:和A女生一起吃早飯

周二下午:和B女生一起逛街

周三晚上:和C女生一起看電影

只要小張把時(shí)間表安排好,這三個(gè)女生就不會(huì)知道其他兩個(gè)人的存在。

從宏觀上來(lái)看,(一年)小張同學(xué)同時(shí)和三個(gè)女生交往。渣男

從微觀上來(lái)看,(一天)小張同學(xué)同一時(shí)刻只是和一個(gè)女生交往。好男人。

換到電腦上操作系統(tǒng)就是這樣管理進(jìn)程的。

只不過(guò)現(xiàn)實(shí)中CPU運(yùn)行速度太快,我們感受不到。我們覺(jué)得好像CPU是同時(shí)在運(yùn)行這么多進(jìn)程一樣。

進(jìn)程的優(yōu)先級(jí):安排時(shí)間表的時(shí)候優(yōu)先給誰(shuí)安排

進(jìn)程的上下文:將寄存器的信息保存到內(nèi)存中。記錄上次運(yùn)行到哪個(gè)指令,下次再調(diào)度的時(shí)候就可以很方便的繼續(xù)從這個(gè)位置執(zhí)行。可以理解為單機(jī)游戲的存檔,讀檔。

進(jìn)程的記賬信息:記錄這個(gè)進(jìn)程在CPU上執(zhí)行了多久,用來(lái)輔助決定這個(gè)進(jìn)程是否要繼續(xù)執(zhí)行還是說(shuō)要調(diào)度出去。

1.2認(rèn)識(shí)線程

為什么需要線程?

我們引入進(jìn)程的目的,就是為了能夠"并發(fā)編程"。為了同時(shí)運(yùn)行多個(gè)程序,雖然多進(jìn)程已經(jīng)能夠并發(fā)進(jìn)程了,但是多進(jìn)程還是有一定的提升空間。

創(chuàng)建進(jìn)程、銷(xiāo)毀進(jìn)程、調(diào)度進(jìn)程這些操作的開(kāi)銷(xiāo)有點(diǎn)太大了。 為此,引入了線程。

線程

Thread,在有些系統(tǒng)上也叫做"輕量級(jí)進(jìn)程"。為什么說(shuō)它輕量呢?

創(chuàng)建線程比創(chuàng)建進(jìn)程更高效;

銷(xiāo)毀線程比銷(xiāo)毀進(jìn)程更高效;

調(diào)度線程比調(diào)度進(jìn)程更高效;

因?yàn)閯?chuàng)建線程并沒(méi)有申請(qǐng)資源,銷(xiāo)毀線程也不需要釋放資源。直接讓線程產(chǎn)生在進(jìn)程內(nèi)部,公用之前的資源。

線程和進(jìn)制是包含的關(guān)系。一個(gè)進(jìn)程可以包含多個(gè)線程或者一個(gè)線程。當(dāng)創(chuàng)建進(jìn)程之后,就相當(dāng)于把資源都分配好了,接著在這個(gè)進(jìn)程里面創(chuàng)建線程,這樣的線程就和之前的進(jìn)程公用一樣的資源了。

1.3進(jìn)程、線程之前的區(qū)別和聯(lián)系(面試題)

1、進(jìn)程是操作系統(tǒng)資源分配的基本單位,線程是操作系統(tǒng)調(diào)度執(zhí)行的基本單位。

2、進(jìn)程是包含線程的,一個(gè)進(jìn)程可以含有多個(gè)線程,也可以含有一個(gè)線程。

3、每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存空間(虛擬地址空間),同一個(gè)進(jìn)程的多個(gè)線程之間,公用這個(gè)虛擬地址空間。

創(chuàng)建線程的幾種方式

1、創(chuàng)建自定義類(lèi)繼承Thread類(lèi)重寫(xiě)run方法

/**
 * Thread是Java標(biāo)準(zhǔn)庫(kù)中的一個(gè)關(guān)于線程的類(lèi)
 * 常用的方式是自定義一個(gè)類(lèi)繼承Thread類(lèi),然后重寫(xiě)run方法
 * 這里的run方法就是線程具體要執(zhí)行的任務(wù)(代碼)
 */
public class threadDemo1 {
    public static void main (String[] args) {
        Thread t=new Thread ();
    //start方法就會(huì)在操作系統(tǒng)中創(chuàng)建一個(gè)線程出來(lái)。
        t.start ();
    }
}
class MyThread extends Thread{
@Override
public void run(){
    System.out.println ("繼承Thread類(lèi)創(chuàng)建線程");
}

}

2、實(shí)現(xiàn)Runable接口,重寫(xiě)run方法

public class threadDemo2 {
    public static void main (String[] args) {
        Thread T=new Thread (new myRunable ());
        T.start ();
    }
}
class  myRunable implements  Runnable{
    @Override 
    public  void run(){
        System.out.println ("實(shí)現(xiàn)Runbale接口,重寫(xiě)run");
    }
}

3、繼承Thread類(lèi)重寫(xiě)run方法,使用匿名內(nèi)部類(lèi)的方式

   public static void main (String[] args) {
        Thread t=new Thread (){
            @Override
            public  void  run(){
                System.out.println ("匿名內(nèi)部類(lèi)");
            }
        };
        t.start ();
    }

4、實(shí)現(xiàn)Runable,重寫(xiě)run方法,使用匿名內(nèi)部類(lèi)

    public static void main (String[] args) {
    Thread t=new Thread (new Runnable () {
        @Override
        public void run () {
            System.out.println ("實(shí)現(xiàn)Runable,重寫(xiě)run,使用匿名內(nèi)部類(lèi)");
        }
    });
    t.start ();
}

5、使用lambda表達(dá)式

//
Thread t3 = new Thread(() -> System.out.println("使用匿名類(lèi)創(chuàng)建 Thread 子類(lèi)對(duì)象"));
Thread t4 = new Thread(() -> {
    System.out.println("使用匿名類(lèi)創(chuàng)建 Thread 子類(lèi)對(duì)象");
});

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論