最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基礎(chǔ)夯實(shí)之線程問題全面解析

 更新時(shí)間:2022年11月02日 14:38:43   作者:一燈架構(gòu)  
操作系統(tǒng)支持多個(gè)應(yīng)用程序并發(fā)執(zhí)行,每個(gè)應(yīng)用程序至少對(duì)應(yīng)一個(gè)進(jìn)程?。進(jìn)程是資源分配的最小單位,而線程是CPU調(diào)度的最小單位。本文將帶大家全面解析線程相關(guān)問題,感興趣的可以了解一下

1. 線程是什么

操作系統(tǒng)支持多個(gè)應(yīng)用程序并發(fā)執(zhí)行,每個(gè)應(yīng)用程序至少對(duì)應(yīng)一個(gè)進(jìn)程 ,彼此之間的操作和數(shù)據(jù)不受干擾,彼此通信一般采用管道通信、消息隊(duì)列、共享內(nèi)存等方式。當(dāng)一個(gè)進(jìn)程需要磁盤IO的時(shí)候,CPU就切換到另外的進(jìn)程,提高了CPU利用率。

有了進(jìn)程,為什么還要線程?因?yàn)檫M(jìn)程的成本太高了。

啟動(dòng)新的進(jìn)程必須分配獨(dú)立的內(nèi)存空間,建立數(shù)據(jù)表維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是昂貴的多任務(wù)工作方式。線程可以看作輕量化的進(jìn)程。線程之間使用相同的地址空間,切換線程的時(shí)間遠(yuǎn)小于切換進(jìn)程的時(shí)間。

進(jìn)程是資源分配的最小單位,而線程是CPU調(diào)度的最小單位。每一個(gè)進(jìn)程中至少有一個(gè)線程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源,多個(gè)線程可以完成多個(gè)不同的任務(wù),也就是我們常說的并發(fā)多線程。

2. 怎樣創(chuàng)建線程

創(chuàng)建線程常用的有四種方式,分別是:

  • 繼承Thread類
  • 實(shí)現(xiàn)Runnable接口
  • 實(shí)現(xiàn)Callable接口
  • 使用線程池創(chuàng)建

分別看一下怎么具體怎么使用代碼創(chuàng)建的?

2.1 繼承Thread類

public class ThreadDemo {

    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start(); // 啟動(dòng)線程
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("關(guān)注公眾號(hào):一燈架構(gòu)");
    }
}

輸出結(jié)果:

關(guān)注公眾號(hào):一燈架構(gòu)

start方法用來啟動(dòng)線程,只能被調(diào)用一次。

run方法是線程的核心方法,業(yè)務(wù)邏輯都寫在run方法中。

2.2 實(shí)現(xiàn)Runnable接口

public class ThreadDemo {

    public static void main(String[] args) {
				MyRunnable myRunnable = new MyRunnable();
        Thread thread1 = new Thread(myRunnable, "線程1");
        Thread thread2 = new Thread(myRunnable, "線程2");
        thread1.start(); // 啟動(dòng)線程1
        thread2.start(); // 啟動(dòng)線程2
    }
}

class MyRunnable implements Runnable {
    private int count = 5;

    @Override
    public void run() {
        while (count > 0) {
            System.out.println(Thread.currentThread().getName()
                    + ",關(guān)注公眾號(hào):一燈架構(gòu)," + count--);
        }
    }
}

輸出結(jié)果:

線程2,關(guān)注公眾號(hào):一燈架構(gòu),4
線程1,關(guān)注公眾號(hào):一燈架構(gòu),5
線程1,關(guān)注公眾號(hào):一燈架構(gòu),2
線程1,關(guān)注公眾號(hào):一燈架構(gòu),1
線程2,關(guān)注公眾號(hào):一燈架構(gòu),3

需要把Runnable實(shí)例放到Thread類中,才能執(zhí)行,Thread對(duì)象才是真正的線程對(duì)象。

使用實(shí)現(xiàn)Runnable接口創(chuàng)建線程方式,相比繼承Thread類創(chuàng)建線程,優(yōu)點(diǎn)是:

  • 實(shí)現(xiàn)的方式?jīng)]有類的單繼承性的局限性
  • 實(shí)現(xiàn)的方式更適合來處理多個(gè)線程有共享數(shù)據(jù)的情況

2.3 實(shí)現(xiàn)Callable接口

public class ThreadTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable myCallable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<String>(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println(futureTask.get());
    }
}

class MyCallable implements Callable {
    @Override
    public String call() throws Exception {
        return "關(guān)注公眾號(hào):一燈架構(gòu)";
    }
}

輸出結(jié)果:

關(guān)注公眾號(hào):一燈架構(gòu)

實(shí)現(xiàn)Callable接口的線程實(shí)例對(duì)象,配合FutureTask使用,可以接收返回值。

2.4 使用線程池創(chuàng)建

public class ThreadDemo {

    public static void main(String[] args)  {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        executorService.execute(() -> System.out.println("關(guān)注公眾號(hào):一燈架構(gòu)"));
    }
}

輸出結(jié)果:

關(guān)注公眾號(hào):一燈架構(gòu)

使用線程池創(chuàng)建線程是工作開發(fā)中最常用的方式,優(yōu)點(diǎn)是:

  • 線程池幫忙管理對(duì)象的創(chuàng)建與銷毀,減輕開發(fā)者工作量
  • 線程池幫忙管理任務(wù)的調(diào)用,資源的創(chuàng)建與分配
  • 復(fù)用線程和對(duì)象,提高使用效率

3. 線程的狀態(tài)

線程共有6種狀態(tài),分別是NEW(初始化)、RUNNABLE(可運(yùn)行)、WAITING(等待)、TIMED_WAITING(超時(shí)等待)、BLOCKED(阻塞)、TERMINATED(終止)。

1.NEW(初始化)

表示創(chuàng)建線程對(duì)象之后,還沒有調(diào)用start方法。

2.RUNNABLE(可運(yùn)行)

表示調(diào)用start方法之后,等待CPU調(diào)度。為了便于理解,通常又把RUNNABLE分別RUNNING(運(yùn)行中)和READY(就緒)。處在RUNNING(運(yùn)行中)狀態(tài)的線程可以調(diào)用yield方法,讓出CPU時(shí)間片,然后跟其他處于READY(就緒)一起等待被調(diào)度。

3.WAITING(等待)

處于RUNNABLE狀態(tài)的線程調(diào)用wait方法之后,就處于等待狀態(tài),需要其他線程顯示地喚醒。

4.TIMED_WAITING(超時(shí)等待)

處于RUNNABLE狀態(tài)的線程調(diào)用wait(long)方法之后,就處于等待狀態(tài),需要其他線程顯示地喚醒。

5.BLOCKED(阻塞)

等待進(jìn)入synchronized方法/代碼塊,處于阻塞狀態(tài)。

6.TERMINATED(終止)

表示線程已經(jīng)執(zhí)行結(jié)束。

4. 線程常用方法

說一下線程有哪些常用的方法。

方法定義含義使用方式
public synchronized void start() {……}啟動(dòng)線程MyThread myThread = new MyThread();
myThread.start();
public static native Thread currentThread();獲取當(dāng)前線程實(shí)例對(duì)象Thread thread = Thread.currentThread();
public static native void yield();讓出CPU時(shí)間片Thread.yield();
public static native void sleep(long millis);睡眠指定時(shí)間Thread.sleep(1L);
public void interrupt() {……}中斷線程MyThread myThread = new MyThread();
myThread.interrupt();
public static boolean interrupted() {……}判斷線程是否已中斷MyThread myThread = new MyThread();
boolean interrupted = myThread.isInterrupted();
public final native boolean isAlive();判斷線程是否是存活狀態(tài)MyThread myThread = new MyThread();
boolean alive = myThread.isAlive();
public final String getName() {……}獲取線程名稱MyThread myThread = new MyThread();
String name = myThread.getName();
public State getState() {……}獲取線程狀態(tài)MyThread myThread = new MyThread();
Thread.State state = myThread.getState();
public long getId() {……}獲取線程IDMyThread myThread = new MyThread();
long id = myThread.getId();
public final void join() {……}等待其他線程執(zhí)行完再執(zhí)行MyThread myThread = new MyThread();
myThread.join();

以上就是Java基礎(chǔ)夯實(shí)之線程問題全面解析的詳細(xì)內(nèi)容,更多關(guān)于Java線程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django之多對(duì)多查詢與操作方法詳解

    Django之多對(duì)多查詢與操作方法詳解

    這篇文章主要介紹了Django之多對(duì)多查詢與操作方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • SpringSecurity 自定義表單登錄的實(shí)現(xiàn)

    SpringSecurity 自定義表單登錄的實(shí)現(xiàn)

    這篇文章主要介紹了SpringSecurity 自定義表單登錄的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 詳解Java中Vector和ArrayList的區(qū)別

    詳解Java中Vector和ArrayList的區(qū)別

    這篇文章主要為大家詳細(xì)介紹了Java中Vector和ArrayList的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • java操作elasticsearch的案例解析

    java操作elasticsearch的案例解析

    這篇文章主要介紹了java操作elasticsearch的案例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 詳談jvm--Java中init和clinit的區(qū)別

    詳談jvm--Java中init和clinit的區(qū)別

    下面小編就為大家?guī)硪黄斦刯vm--Java中init和clinit的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 在idea 中添加和刪除模塊Module操作

    在idea 中添加和刪除模塊Module操作

    這篇文章主要介紹了在idea 中添加和刪除模塊Module操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解

    使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解

    這篇文章主要介紹了使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • java拼接字符串時(shí)去掉最后一個(gè)多余逗號(hào)的方法

    java拼接字符串時(shí)去掉最后一個(gè)多余逗號(hào)的方法

    這篇文章主要介紹了java拼接字符串時(shí)去掉最后一個(gè)多余逗號(hào)的方法,實(shí)例分析了java操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • JAVA驗(yàn)證身份證號(hào)碼有效性的實(shí)例代碼

    JAVA驗(yàn)證身份證號(hào)碼有效性的實(shí)例代碼

    很多項(xiàng)目業(yè)務(wù)都會(huì)設(shè)計(jì)到人員信息,那么身份證號(hào)就是必不可少的校驗(yàn)項(xiàng),下面這篇文章主要給大家介紹了關(guān)于JAVA驗(yàn)證身份證號(hào)碼有效性的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法)

    IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法)

    這篇文章主要介紹了IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

沙湾县| 霍城县| 江华| 凌海市| 中阳县| 通山县| 宜州市| 河北区| 全州县| 新绛县| 封丘县| 龙门县| 镇江市| 海门市| 分宜县| 盐津县| 青神县| 来凤县| 台前县| 福贡县| 延安市| 洛宁县| 龙川县| 黑龙江省| 邹城市| 西峡县| 敦化市| 仪陇县| 洮南市| 昔阳县| 惠来县| 富裕县| 永城市| 工布江达县| 年辖:市辖区| 盘锦市| 安多县| 昌黎县| 巢湖市| 兰考县| 会同县|