国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

高級(jí)進(jìn)階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式

這篇具有很好參考價(jià)值的文章主要介紹了高級(jí)進(jìn)階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Java多線程

Java中的多線程是一個(gè)同時(shí)執(zhí)行多個(gè)線程的進(jìn)程。線程是一個(gè)輕量級(jí)的子進(jìn)程,是最小的處理單元。多進(jìn)程和多線程都用于實(shí)現(xiàn)多任務(wù)處理。

但是,一般使用多線程而不是多進(jìn)程,這是因?yàn)榫€程使用共享內(nèi)存區(qū)域。它們不分配單獨(dú)的內(nèi)存區(qū)域以節(jié)省內(nèi)存,并且線程之間的上下文切換比進(jìn)程花費(fèi)的時(shí)間更少。

Java多線程主要用于游戲,動(dòng)畫等。

優(yōu)點(diǎn)

(1)它不會(huì)阻塞用戶,因?yàn)榫€程是獨(dú)立的,可以同時(shí)執(zhí)行多個(gè)操作。
(2)可以一起執(zhí)行許多操作,因此可以節(jié)省時(shí)間。
(3)線程是獨(dú)立的,因此如果在單個(gè)線程中發(fā)生異常,它不會(huì)影響其他線程。

多任務(wù)處理

多任務(wù)處理是同時(shí)執(zhí)行多個(gè)任務(wù)的過(guò)程。使用多任務(wù)來(lái)利用CPU,多任務(wù)處理可以通過(guò)兩種方式實(shí)現(xiàn):

基于進(jìn)程的多任務(wù)處理(多進(jìn)程)
基于線程的多任務(wù)處理(多線程)

基于進(jìn)程的多任務(wù)處理(多進(jìn)程)
  • 每個(gè)進(jìn)程在內(nèi)存中都有一個(gè)地址。 換句話說(shuō),每個(gè)進(jìn)程分配一個(gè)單獨(dú)的內(nèi)存區(qū)域。
  • 進(jìn)程是重量級(jí)的。
  • 進(jìn)程之間的通信成本很高。
  • 從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程需要一些時(shí)間來(lái)保存和加載寄存器,內(nèi)存映射,更新列表等。
基于線程的多任務(wù)處理(多線程)
  • 線程共享相同的地址空間。
  • 線程是輕量級(jí)的。
  • 線程之間的通信成本很低。

注意:一次只執(zhí)行一個(gè)線程。

線程的生命周期(線程狀態(tài))

線程可以處于五種狀態(tài)之一。 根據(jù)sun解釋,線程生命周期在java中有以下幾種狀態(tài):初始(NEW) ,運(yùn)行(RUNNABLE),阻塞(BLOCKED),等待(WAITING),超時(shí)等待(TIMED_WAITING)終止(TERMINATED)。

java中線程的生命周期由JVM控制,java線程狀態(tài)如下:

  1. 初始(NEW):新創(chuàng)建了一個(gè)線程對(duì)象,但還沒(méi)有調(diào)用start()方法。
  2. 運(yùn)行(RUNNABLE):Java線程中將就緒(ready)和運(yùn)行中(running)兩種狀態(tài)籠統(tǒng)的稱為“運(yùn)行”。
    線程對(duì)象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中,獲取CPU的使用權(quán),此時(shí)處于就緒狀態(tài)(ready)。就緒狀態(tài)的線程在獲得CPU時(shí)間片后變?yōu)檫\(yùn)行中狀態(tài)(running)。
  3. 阻塞(BLOCKED):表示線程阻塞于鎖。
  4. 等待(WAITING):進(jìn)入該狀態(tài)的線程需要等待其他線程做出一些特定動(dòng)作(通知或中斷)。
  5. 超時(shí)等待(TIMED_WAITING):該狀態(tài)不同于WAITING,它可以在指定的時(shí)間后自行返回。
  6. 終止(TERMINATED):表示該線程已經(jīng)執(zhí)行完畢。
新建狀態(tài):

使用 new 關(guān)鍵字和 Thread 類或其子類建立一個(gè)線程對(duì)象后,該線程對(duì)象就處于新建狀態(tài)。它保持這個(gè)狀態(tài)直到程序 start() 這個(gè)線程。

就緒狀態(tài)

當(dāng)線程對(duì)象調(diào)用了start()方法之后,該線程就進(jìn)入就緒狀態(tài)。就緒狀態(tài)的線程處于就緒隊(duì)列中,要等待JVM里線程調(diào)度器的調(diào)度。

運(yùn)行狀態(tài)

如果就緒狀態(tài)的線程獲取 CPU 資源,就可以執(zhí)行 run(),此時(shí)線程便處于運(yùn)行狀態(tài)。處于運(yùn)行狀態(tài)的線程最為復(fù)雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。

阻塞狀態(tài):

如果一個(gè)線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)。在睡眠時(shí)間已到或獲得設(shè)備資源后可以重新進(jìn)入就緒狀態(tài)??梢苑譃槿N:

  • 等待阻塞:運(yùn)行狀態(tài)中的線程執(zhí)行 wait() 方法,使線程進(jìn)入到等待阻塞狀態(tài)。

  • 同步阻塞:線程在獲取 synchronized 同步鎖失敗(因?yàn)橥芥i被其他線程占用)。

  • 其他阻塞:通過(guò)調(diào)用線程的 sleep() 或 join() 發(fā)出了 I/O 請(qǐng)求時(shí),線程就會(huì)進(jìn)入到阻塞狀態(tài)。當(dāng)sleep() 狀態(tài)超時(shí),join() 等待線程終止或超時(shí),或者 I/O 處理完畢,線程重新轉(zhuǎn)入就緒狀態(tài)。

死亡狀態(tài)

一個(gè)運(yùn)行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生時(shí),該線程就切換到終止?fàn)顟B(tài)。

創(chuàng)建線程

創(chuàng)建一個(gè)線程有三種方法:

  • 通過(guò)擴(kuò)展Thread類。
  • 通過(guò)實(shí)現(xiàn)Runnable接口。
  • 通過(guò) Callable 和 Future 創(chuàng)建線程。

Thread類
Thread類提供了在線程上創(chuàng)建和執(zhí)行操作的構(gòu)造函數(shù)和方法。Thread類擴(kuò)展了Object類并實(shí)現(xiàn)了Runnable接口。

常用的Thread類構(gòu)造函數(shù)

  • Thread()
  • Thread(String name)
  • Thread(Runnable r)
  • Thread(Runnable r,String name)

Thread類的常用方法:

  • public void run(): 用于執(zhí)行線程的操作。
  • public void start(): 開(kāi)始執(zhí)行線程,JVM調(diào)用線程上的run()方法。
  • public void sleep(long miliseconds): 使當(dāng)前正在執(zhí)行的線程休眠(暫時(shí)停止執(zhí)行)達(dá)指定的毫秒數(shù)。
  • public void join(): 等待線程死亡。
  • public void join(long miliseconds): 按指定的毫秒數(shù)等待線程死亡。
  • public int getPriority(): 返回線程的優(yōu)先級(jí)。
  • public int setPriority(int priority): 更改線程的優(yōu)先級(jí)。
  • public String getName(): 返回線程的名稱。
  • public void setName(String name): 更改線程的名稱。
  • public int getId():返回線程的編號(hào)(ID)。
  • public Thread.State getState(): 返回線程的狀態(tài)。
  • public boolean isAlive(): 測(cè)試線程是否處于活動(dòng)狀態(tài)。
  • public void yield(): 使當(dāng)前正在執(zhí)行的線程對(duì)象暫時(shí)暫停并允許其他線程執(zhí)行。
  • public void suspend(): 用于掛起線程(depricated)。
  • public void resume(): 用于恢復(fù)掛起的線程(depricated)。
  • public void stop(): 用于停止線程(depricated)。
  • public boolean isDaemon(): 測(cè)試該線程是否為守護(hù)進(jìn)程線程。
  • public void setDaemon(boolean b): 將線程標(biāo)記為守護(hù)進(jìn)程或用戶線程。
  • public void interrupt(): 中斷線程。
  • public boolean isInterrupted(): 測(cè)試線程是否被中斷。
  • public static boolean interrupted(): 測(cè)試當(dāng)前線程是否已被中斷。

Runnable接口:
Runnable接口應(yīng)由任何其實(shí)例由線程執(zhí)行類實(shí)現(xiàn)。Runnable接口只有一個(gè)run()方法。

  • public void run(): 用于執(zhí)行線程的操作。

啟動(dòng)線程:

Thread類的start()方法用于啟動(dòng)新創(chuàng)建的線程。它執(zhí)行以下任務(wù):

  • 一個(gè)新線程啟動(dòng)(使用新的callstack)。
  • 線程從New狀態(tài)移動(dòng)到Runnable狀態(tài)。
  • 當(dāng)線程有機(jī)會(huì)執(zhí)行時(shí),它的目標(biāo)run()方法將運(yùn)行。

示例

1. 通過(guò)擴(kuò)展Thread類線程示例
package com.yiibai;

class Multi extends Thread {
    public void run() {
        System.out.println("thread is running...");
    }

    public static void main(String args[]) {
        Multi t1 = new Multi();
        t1.start();
    }
}

執(zhí)行上面示例代碼,得到以下結(jié)果:

thread is running...
2. 通過(guò)實(shí)現(xiàn)Runnable接口的線程示例
package com.yiibai;

class Multi implements Runnable {
    public void run() {
        System.out.println("thread is running...");
    }

    public static void main(String args[]) {
        Multi m1 = new Multi();
        Thread t1 = new Thread(m1);
        t1.start();
    }
}

執(zhí)行上面示例代碼,得到以下結(jié)果:

thread is running...

如果沒(méi)有擴(kuò)展Thread類,類對(duì)象就不會(huì)被視為一個(gè)線程對(duì)象。所以需要明確地創(chuàng)建Thread類對(duì)象。傳遞實(shí)現(xiàn)Runnable類的對(duì)象,以便類的run()方法可以執(zhí)行。

3.通過(guò) Callable 和 Future 創(chuàng)建線程
  • 創(chuàng)建 Callable 接口的實(shí)現(xiàn)類,并實(shí)現(xiàn) call() 方法,該 call() 方法將作為線程執(zhí)行體,并且有返回值。
  • 創(chuàng)建 Callable 實(shí)現(xiàn)類的示例,使用 FutureTask 類來(lái)包裝 Callable 對(duì)象,該 FutureTask 對(duì)象封裝了該 Callable 對(duì)象的 call() 方法的返回值。
  • 使用 FutureTask 對(duì)象作為 Thread 對(duì)象的 target 創(chuàng)建并啟動(dòng)新線程。
  • 調(diào)用 FutureTask 對(duì)象的 get() 方法來(lái)獲得子線程執(zhí)行結(jié)束后的返回值。
public class Zeus implements Callable<Integer> {
    public static void main(String[] args)  
    {  
        CallableThreadTest ctt = new CallableThreadTest();  
        FutureTask<Integer> ft = new FutureTask<>(ctt);  
        for(int i = 0;i < 100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" 的循環(huán)變量i的值"+i);  
            if(i==20)  
            {  
                new Thread(ft,"有返回值的線程").start();  
            }  
        }  
        try  
        {  
            System.out.println("子線程的返回值:"+ft.get());  
        } catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        } catch (ExecutionException e)  
        {  
            e.printStackTrace();  
        }  
  
    }
    @Override  
    public Integer call() throws Exception  
    {  
        int i = 0;  
        for(;i<100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" "+i);  
        }  
        return i;  
    }  
}

創(chuàng)建線程的三種方式的對(duì)比

  • ?采用實(shí)現(xiàn) Runnable、Callable 接口的方式創(chuàng)建多線程時(shí),線程類只是實(shí)現(xiàn)了 Runnable 接口或 Callable 接口,還可以繼承其他類。
  • 使用繼承 Thread 類的方式創(chuàng)建多線程時(shí),編寫簡(jiǎn)單,如果需要訪問(wèn)當(dāng)前線程,則無(wú)需使用 Thread.currentThread() 方法,直接使用 this 即可獲得當(dāng)前線程。

線程的幾個(gè)主要概念

在多線程編程時(shí),你需要了解以下幾個(gè)概念:

  • 線程同步

  • 線程間通信

  • 線程死鎖

Java線程調(diào)度程序

Java的線程調(diào)度程序是JVM的一部分,它決定應(yīng)該運(yùn)行哪個(gè)線程。無(wú)法保證線程調(diào)度程序?qū)⑦x擇運(yùn)行哪個(gè)可運(yùn)行線程。

一次只能有一個(gè)線程在一個(gè)進(jìn)程中運(yùn)行。線程調(diào)度程序主要使用搶占式或時(shí)間切片調(diào)度來(lái)調(diào)度線程。

搶占式調(diào)度與時(shí)間分片的區(qū)別

在搶占式調(diào)度下,優(yōu)先級(jí)最高的任務(wù)一直執(zhí)行,直到它進(jìn)入等待或死亡狀態(tài)或更高優(yōu)先級(jí)的任務(wù)出現(xiàn)。 在時(shí)間切片下,任務(wù)執(zhí)行預(yù)定義的一段時(shí)間,然后重新進(jìn)入就緒任務(wù)池。 然后,調(diào)度程序根據(jù)優(yōu)先級(jí)和其他因素確定接下來(lái)應(yīng)執(zhí)行的任務(wù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-643826.html

到了這里,關(guān)于高級(jí)進(jìn)階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MediaPlayer狀態(tài)圖及生命周期

    MediaPlayer狀態(tài)圖及生命周期

    MediaPlayer狀態(tài)圖及生命周期 MediaPlayer是Android中的uoge多媒體播放類,我們能通過(guò)它控制音視頻流或本地音視頻資源的播放過(guò)程。 這一片博客主要介紹MediaPlayer狀態(tài)圖及生命周期。先看一張官網(wǎng)很經(jīng)典的MediaPlayer狀態(tài)機(jī)的圖片。 其中橢圓代表MediaPlayer駐留狀態(tài),弧代表播放器控制

    2023年04月08日
    瀏覽(23)
  • Java線程生命周期詳解

    Java線程生命周期詳解

    Java中的線程生命周期是多線程開(kāi)發(fā)的核心概念。了解線程的生命周期以及它們?nèi)绾芜M(jìn)行狀態(tài)轉(zhuǎn)換對(duì)于編寫有效且無(wú)錯(cuò)誤的多線程程序至關(guān)重要。 Java線程主要有以下幾個(gè)狀態(tài),這些狀態(tài)定義在Thread.State枚舉類中: 新建狀態(tài)(New) :當(dāng)我們創(chuàng)建一個(gè)新的線程實(shí)例時(shí),線程就處

    2024年02月11日
    瀏覽(26)
  • HarmonyOS Stage模型 UIAbility生命周期狀態(tài)

    HarmonyOS Stage模型 UIAbility生命周期狀態(tài)

    UIAbility的生命周期包括Create、Foreground、Background、Destroy四個(gè)狀態(tài) Create 狀態(tài),在UIAbility實(shí)例 創(chuàng)建 時(shí)觸發(fā),對(duì)應(yīng)onCreate回調(diào)??梢栽趏nCreate回調(diào)中進(jìn)行相關(guān)初始化操作 Foreground 狀態(tài),在UIAbility 切換至前臺(tái) 時(shí)觸發(fā)。對(duì)應(yīng)onForeground回調(diào),在UIAbility的UI頁(yè)面可見(jiàn)之前,即UIAbility切換至

    2024年01月16日
    瀏覽(59)
  • Spring進(jìn)階(十六)之spring生命周期

    Spring進(jìn)階(十六)之spring生命周期

    目錄 Bean生命周期 階段1:Bean元信息配置階段 Bean信息定義4種方式 API的方式 XML的方式 properties文件的方式 注解的方式 小結(jié) 階段2:Bean元信息解析階段 Bean元信息的解析主要有3種方式 XML方式解析:XmlBeanDefinitionReader properties文件定義bean的解析: PropertiesBeanDefinitionReader 注解方式

    2024年02月03日
    瀏覽(20)
  • Flutter 05 組件狀態(tài)、生命周期、數(shù)據(jù)傳遞(共享)、Key

    Flutter 05 組件狀態(tài)、生命周期、數(shù)據(jù)傳遞(共享)、Key

    1、Widget組件生命周期 和其他的視圖框架比如android的Activity一樣,flutter中的視圖Widget也存在生命周期,生命周期的回調(diào)函數(shù)體現(xiàn)在了State上面。組件State的生命周期整理如下圖所示: createState: 當(dāng)一個(gè)StatefulWidget插入到渲染樹結(jié)構(gòu)、或者從渲染樹結(jié)構(gòu)移除時(shí),都會(huì)調(diào)用Stateful

    2024年02月05日
    瀏覽(24)
  • Flutter筆記:Flutter的應(yīng)用生命周期狀態(tài)(lifecycleState)管理

    Flutter筆記 Flutter的應(yīng)用生命周期狀態(tài)(lifecycleState)管理 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134127670 【介紹】: WidgetsBinding.instance 是Flutter中用于管理應(yīng)用程序事件和生命周期的重要工具

    2024年02月06日
    瀏覽(21)
  • 【JavaEE進(jìn)階】Bean 作用域和生命周期

    【JavaEE進(jìn)階】Bean 作用域和生命周期

    注意在此例子中需要用到lombok lombok是什么? Lombok 是一個(gè) Java 庫(kù),它通過(guò)注解的方式來(lái)簡(jiǎn)化 Java 代碼的編寫。它提供了一組注解,讓我們可以通過(guò)在代碼中添加這些注解來(lái)自動(dòng)生成樣板式的代碼,如 getter、setter、構(gòu)造函數(shù)、toString 等。 使用 Lombok 可以有效地減少冗余的樣板代

    2024年02月12日
    瀏覽(25)
  • K8s進(jìn)階之路-Pod的生命周期

    K8s進(jìn)階之路-Pod的生命周期

    Pod創(chuàng)建過(guò)程: 首先創(chuàng)建一個(gè)pod,然后創(chuàng)建一個(gè)API Server 和 Etcd【把創(chuàng)建出來(lái)的信息存儲(chǔ)在etcd中】 然后創(chuàng)建 Scheduler,監(jiān)控API Server是否有新的Pod,如果有的話,會(huì)通過(guò)調(diào)度算法,把pod調(diào)度某個(gè)node上 在node節(jié)點(diǎn),會(huì)通過(guò) kubelet -- apiserver 讀取etcd 拿到分配在當(dāng)前node節(jié)點(diǎn)上的pod,然后

    2024年02月20日
    瀏覽(19)
  • Angular 17+ 高級(jí)教程 – Component 組件 の 生命周期鉤子 (Lifecycle Hooks)

    Angular 17+ 高級(jí)教程 – Component 組件 の 生命周期鉤子 (Lifecycle Hooks)

    之前在 Component 組件 の Angular Component vs Custom Elements?文章中,我們有學(xué)習(xí)過(guò)幾個(gè)基礎(chǔ)的 Lifecycle Hooks。 比如?OnChanges、OnInit、AfterViewInit、OnDestroy,但那篇只是微微帶過(guò)而已。 這篇讓我們來(lái)深入理解 Angular 的?Lifecycle Hooks。 ? 在?Component 組件 の Dependency Injection NodeInjector?文章中

    2024年03月09日
    瀏覽(37)
  • unity的C#學(xué)習(xí)——多線程編程(線程的生命周期、創(chuàng)建與管理)與線程相關(guān)類

    多線程編程是 C# 一個(gè)比較難且涵蓋面比較廣的知識(shí)點(diǎn),本文整理倉(cāng)促而且屬于筆記向博客,有些地方必然還存在不嚴(yán)謹(jǐn)和錯(cuò)誤,本人會(huì)在日后的使用過(guò)程中不斷完善。如果發(fā)現(xiàn)問(wèn)題或有改進(jìn)意見(jiàn)可以在評(píng)論區(qū)提出,我會(huì)及時(shí)修改。 線程是程序的執(zhí)行流程,也被稱為 輕量級(jí)進(jìn)

    2024年02月12日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包