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

java中多線程

這篇具有很好參考價(jià)值的文章主要介紹了java中多線程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


多線程

進(jìn)程和線程

進(jìn)程

進(jìn)程:是正在運(yùn)行的程序

  • 是系統(tǒng)進(jìn)行資源分配和調(diào)用的獨(dú)立單位

  • 每個(gè)進(jìn)程都具有它自己的存儲(chǔ)空間和系統(tǒng)資源

線程

線程:是進(jìn)程中的單個(gè)順序控制流,是一條執(zhí)行路徑

  • 單線程:一個(gè)進(jìn)程如果只有一條執(zhí)行路徑,則稱之為單線程程序

  • 多線程:一個(gè)進(jìn)程如果有多條執(zhí)行路徑,則稱之為多線程程序

繼承Thread類方式實(shí)現(xiàn)多線程

  • 繼承 Thread 類

  • 定義一個(gè) MyThread 繼承 Thread 類

  • 在 MyThread 類中重寫 run() 方法

  • 創(chuàng)建 MyThread 類的對(duì)象

  • 啟動(dòng)線程

demo:

定義一個(gè)名字為MyThread的類繼承Thread類,重新里面的run方法

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定義線程 - 繼承Thread類
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    @Override
    // 當(dāng)線程被啟動(dòng)時(shí),會(huì)自動(dòng)調(diào)用run方法
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("i = " + i);
        }
    }
}

創(chuàng)建測(cè)試類demo01

package com.itxs.demo01;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 創(chuàng)建線程對(duì)象
        MyThread mt01 = new MyThread();
        MyThread mt02 = new MyThread();
        MyThread mt03 = new MyThread();
         // 通過start方法來啟動(dòng)多線程
        mt01.start();
        mt02.start();
        mt03.start();
    }
}

運(yùn)行結(jié)果:每個(gè)線程里面都是執(zhí)行三次循環(huán),并沒有順序,而是誰搶到誰執(zhí)行,
java中多線程,常用API - 03,java,python,開發(fā)語言

設(shè)置線程名字的兩個(gè)方式

  1. 調(diào)用方法setName()來設(shè)置線程名字
  2. 通過構(gòu)造方法來設(shè)置線程名字

demo:

自定義的線程類

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定義線程 - 繼承Thread類
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    // 無參構(gòu)造
    public MyThread() {
        super();
    }

    /**
     * 帶參數(shù)構(gòu)造,設(shè)置每個(gè)線程名字
     * @param name 名字
     */
    public MyThread(String name) {
        super(name);
    }

    @Override
    // 當(dāng)線程被啟動(dòng)時(shí),會(huì)自動(dòng)調(diào)用run方法
    public void run() {
        for (int i = 0; i < 3; i++) {
            // this當(dāng)前類,getName表示獲取當(dāng)前類的名字
            System.out.println(this.getName() + " i = " + i);
        }
    }
}

測(cè)試類demo01

package com.itxs.demo01;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 創(chuàng)建線程對(duì)象
        MyThread mt01 = new MyThread("線程01");
        MyThread mt02 = new MyThread("線程02");
        MyThread mt03 = new MyThread();
        // 設(shè)置每個(gè)線程的名字的方法setName();
//        mt01.setName("線程01");
//        mt02.setName("線程02");
        mt03.setName("線程03");
         // 通過start方法來啟動(dòng)多線程
        mt01.start();
        mt02.start();
        mt03.start();
    }
}

運(yùn)行結(jié)果:
java中多線程,常用API - 03,java,python,開發(fā)語言

獲取正在運(yùn)行的線程

調(diào)用下面Thread類中方法,可以獲取當(dāng)前正在運(yùn)行對(duì)象

Thread.currentThread()

main也是一個(gè)線程,設(shè)置main線程名字,沒有辦法通過this.getName和this.setName進(jìn)行設(shè)置,只能通過上面的Thread類中方法進(jìn)行設(shè)置獲取

demo:

注意run方法中,輸出每個(gè)線程名字的地方調(diào)用了Thread.currentThread()

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定義線程 - 繼承Thread類
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    // 無參構(gòu)造
    public MyThread() {
        super();
    }

    /**
     * 帶參數(shù)構(gòu)造,設(shè)置每個(gè)線程名字
     * @param name 名字
     */
    public MyThread(String name) {
        super(name);
    }

    @Override
    // 當(dāng)線程被啟動(dòng)時(shí),會(huì)自動(dòng)調(diào)用run方法
    public void run() {
        for (int i = 0; i < 3; i++) {
            // this當(dāng)前類,getName表示獲取當(dāng)前類的名字
           // System.out.println(this.getName() + " i = " + i);
             System.out.println(Thread.currentThread().getName() + " i = " + i);
        }
    }
}

測(cè)試類demo01: 注意main線程獲取的

package com.itxs.demo01;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 創(chuàng)建線程對(duì)象
        MyThread mt01 = new MyThread("線程01");
        MyThread mt02 = new MyThread("線程02");
        MyThread mt03 = new MyThread();
        // 設(shè)置每個(gè)線程的名字的方法setName();
//        mt01.setName("線程01");
//        mt02.setName("線程02");
        mt03.setName("線程03");
         // 通過start方法來啟動(dòng)多線程
        mt01.start();
        mt02.start();
        mt03.start();
        // 獲取正在運(yùn)行的線程對(duì)象
        Thread.currentThread().setName("主線程");// 設(shè)置main線程名字
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "i = " + i);
        }
    }
}

運(yùn)行結(jié)果:
java中多線程,常用API - 03,java,python,開發(fā)語言

線程調(diào)度模型和線程優(yōu)先級(jí)設(shè)置

兩種調(diào)度模型

  • 兩種線程調(diào)度模型

    • 分時(shí)調(diào)度模型:所有線程輪流使用 CPU 的使用權(quán),平均分配每個(gè)線程占用 CPU 的時(shí)間

    • 搶占調(diào)度模型:優(yōu)先讓優(yōu)先級(jí)高的線程使用 CPU,如果線程的歐優(yōu)先級(jí)相同,那么隨機(jī)選擇一個(gè),優(yōu)先級(jí)高的線程獲取的 CPU 占用時(shí)間會(huì)相對(duì)多一些

    Java 使用的是搶占式的調(diào)度模型

優(yōu)先級(jí)設(shè)置

Thread 類中設(shè)置和獲取線程優(yōu)先級(jí)的方法

 getPriority()//返回次線程的優(yōu)先級(jí)
 setProiority()//更改次線程的優(yōu)先級(jí)

demo:

創(chuàng)建一個(gè)名字為MyThread類繼承Thread類

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定義線程 - 繼承Thread類
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    // 無參構(gòu)造
    public MyThread() {
        super();
    }

    /**
     * 帶參數(shù)構(gòu)造,設(shè)置每個(gè)線程名字
     * @param name 名字
     */
    public MyThread(String name) {
        super(name);
    }

    @Override
    // 當(dāng)線程被啟動(dòng)時(shí),會(huì)自動(dòng)調(diào)用run方法
    public void run() {
        for (int i = 0; i < 50; i++) {
            // this當(dāng)前類,getName表示獲取當(dāng)前類的名字
           // System.out.println(this.getName() + " i = " + i);
             System.out.println(Thread.currentThread().getName() + " i = " + i);
        }
    }
}

測(cè)試類demo02 - 查看優(yōu)先級(jí)高的線程是否能更快執(zhí)行完

package com.itxs.demo01;

/**
 * @Classname : demo02
 * @Description : TODO 線程優(yōu)先級(jí)測(cè)試運(yùn)行結(jié)果
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) {
         // 創(chuàng)建線程
        MyThread mt01 = new MyThread("線程01");
        MyThread mt02 = new MyThread("線程02");
        MyThread mt03 = new MyThread("線程03");
         // 設(shè)置每個(gè)線程優(yōu)先級(jí)
        mt01.setPriority(Thread.MIN_PRIORITY);// 優(yōu)先級(jí)低
        mt02.setPriority(Thread.NORM_PRIORITY);// 優(yōu)先級(jí)不變
        mt03.setPriority(Thread.MAX_PRIORITY); // 優(yōu)先級(jí)最高
        // 輸出每個(gè)線程優(yōu)先級(jí)
//        System.out.println(mt01.getPriority());//1
//        System.out.println(mt02.getPriority());//5
//        System.out.println(mt03.getPriority());//10
        // 開啟線程
        mt01.start();
        mt02.start();
        mt03.start();
    }
}

運(yùn)行結(jié)果: 線程mt03比其他兩個(gè)線程運(yùn)行快一點(diǎn),僅僅一點(diǎn)

線程控制

sleep

sleep:使當(dāng)前正在執(zhí)行的線程停留指定的毫秒數(shù)

demo:案例:華山論劍

定義一個(gè)MyThread類繼承Thread類

package com.itxs.demo02;

/**
 * @Classname : MyThread
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    public MyThread() {
        super();
    }

    // 初始化線程名字的構(gòu)造方法
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + "打出了第" + i + "招");
            // 調(diào)用sleep使其線程執(zhí)行一次循環(huán)后停留1秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

sleeptest測(cè)試類

package com.itxs.demo02;

/**
 * @Classname : sleepTest
 * @Description : TODO sleep測(cè)試類
 * @Author : lin_refuel@qq.com
 */
public class sleepTest {
    public static void main(String[] args) {
        // 創(chuàng)建線程對(duì)象
        MyThread mt01 = new MyThread("黃固");
        MyThread mt02 = new MyThread("歐陽(yáng)鋒");
        MyThread mt03 = new MyThread("段智興");
        MyThread mt04 = new MyThread("洪七公");
        // 開啟線程
        mt01.start();
        mt02.start();
        mt03.start();
        mt04.start();
    }
}

join

join:等待線程結(jié)束

package com.itxs.demo03;

/**
 * @Classname : MyThread
 * @Description : TODO 自定義線程類 - 繼承Thread類
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    public MyThread() {
        super();
    }
    // 設(shè)置線程名字
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+"報(bào)數(shù):"+i);
        }
    }
}

test:測(cè)試類,注意join的使用,需要拋出異常

package com.itxs.demo03;

/**
 * @Classname : test
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class test {
    public static void main(String[] args) throws InterruptedException {
         // 三個(gè)人報(bào)數(shù),第一個(gè)人報(bào)完數(shù)后,其他人才能報(bào)數(shù)
        MyThread mt01 = new MyThread("1號(hào)");
        MyThread mt02 = new MyThread("2號(hào)");
        MyThread mt03 = new MyThread("3號(hào)");
        // 開始報(bào)數(shù)
        mt01.start();
        mt01.join();//等待第一個(gè)人報(bào)數(shù)完畢
        mt02.start();
        mt03.start();
    }
}

守護(hù)線程

setDaemon(boolean on)

將此線程標(biāo)記為守護(hù)進(jìn)程,當(dāng)運(yùn)行線程都是守護(hù)線程時(shí),JVM 將退出

個(gè)人理解:主線程里面運(yùn)行結(jié)束,守護(hù)線程不會(huì)繼續(xù)執(zhí)行

例子:老板帶三個(gè)員工吃飯,老板吃飽后,員工不能繼續(xù)吃了

demo:

定義MyThread類繼承Thread類

package com.itxs.demo04;

/**
 * @Classname : MyThread
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    public MyThread() {
        super();
    }

    // 設(shè)置線程對(duì)象名字
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 1; i <= 50; i++) {
            System.out.println(Thread.currentThread().getName() + "正在吃" + i + "口");
        }
    }
}

定義三個(gè)線程設(shè)置為守護(hù)線程,進(jìn)行測(cè)試,注意守護(hù)線程設(shè)置方式

package com.itxs.demo04;

/**
 * @Classname : test
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class test {
    public static void main(String[] args) {
        // 創(chuàng)建三個(gè)工人線程
        MyThread mt01 = new MyThread("1號(hào)工人");
        MyThread mt02 = new MyThread("1號(hào)工人");
        MyThread mt03 = new MyThread("1號(hào)工人");
        System.out.println("吃飯了");

        // 三個(gè)工人線程設(shè)置為守護(hù)線程,老板說吃飽了,工人就不繼續(xù)吃了
        mt01.setDaemon(true);
        mt02.setDaemon(true);
        mt03.setDaemon(true);
        mt01.start();
        mt02.start();
        mt03.start();
        // 主線程:作為老板
        Thread.currentThread().setName("老板");
        for (int i = 1; i <5; i++) {
            System.out.println(Thread.currentThread().getName() + "正在吃第" + i + "口");
        }
        System.out.println("老板說吃飽了,咱們走吧");
    }
}

線程生命周期

  • 新建:創(chuàng)建線程對(duì)象(通過 start() 進(jìn)入下一個(gè)環(huán)節(jié))

  • 就緒:有執(zhí)行資格,沒有執(zhí)行權(quán)(搶占 CPU 的執(zhí)行權(quán))

  • 運(yùn)行:有執(zhí)行資格,有執(zhí)行權(quán)(可能被其他線程搶走 CPU 的執(zhí)行權(quán),則回到就緒狀態(tài),若遇到阻塞式方法,則失去運(yùn)行權(quán)和執(zhí)行這個(gè),等待,當(dāng)阻塞方法調(diào)用結(jié)束之后,回到就緒狀態(tài))

  • 死亡:線程死亡,成為垃圾文章來源地址http://www.zghlxwxcb.cn/news/detail-796423.html

到了這里,關(guān)于java中多線程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • Java/Python/Go不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計(jì)差異

    Java/Python/Go不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計(jì)差異

    在多線程項(xiàng)目開發(fā)時(shí),最常用、最常遇到的問題是 1,線程、協(xié)程安全 2,線程、協(xié)程間的通信和控制 本文主要探討不同開發(fā)語言go、java、python在進(jìn)程、線程和協(xié)程上的設(shè)計(jì)和開發(fā)方式的異同。 進(jìn)程 進(jìn)程是 操作系統(tǒng)進(jìn)行資源分配的基本單位,每個(gè)進(jìn)程都有自己的獨(dú)立內(nèi)存空

    2024年01月23日
    瀏覽(21)
  • 【JAVAEE學(xué)習(xí)】探究Java中多線程的使用和重點(diǎn)及考點(diǎn)

    【JAVAEE學(xué)習(xí)】探究Java中多線程的使用和重點(diǎn)及考點(diǎn)

    ?????? write in front???????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請(qǐng)多多諒解,讓我們一起共同進(jìn)步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie??????????原創(chuàng) CSDN?如需轉(zhuǎn)載還請(qǐng)通知????? 個(gè)人主頁(yè):xiaoxie??

    2024年04月15日
    瀏覽(21)
  • java中多線程去跑海量數(shù)據(jù)使用線程池批量ThreadPoolExecutor處理的方式和使用Fork/Join框架的方式那種效率高?

    在Java中,使用線程池(ThreadPoolExecutor)和使用Fork/Join框架來處理海量數(shù)據(jù)的效率取決于具體的應(yīng)用場(chǎng)景和需求。下面是一些需要考慮的因素: 任務(wù)類型:如果任務(wù)是CPU密集型的,那么使用Fork/Join框架可能更高效,因?yàn)樗梢宰詣?dòng)進(jìn)行任務(wù)分割和并行處理。如果任務(wù)是I/O密集

    2024年02月10日
    瀏覽(22)
  • Qt中多線程的使用

    Qt中多線程的使用

    在進(jìn)行桌面應(yīng)用程序開發(fā)的時(shí)候, 假設(shè)應(yīng)用程序在某些情況下需要處理比較復(fù)雜的邏輯, 如果只有一個(gè)線程去處理,就會(huì)導(dǎo)致窗口卡頓,無法處理用戶的相關(guān)操作。這種情況下就需要使用多線程,其中一個(gè)線程處理窗口事件,其他線程進(jìn)行邏輯運(yùn)算,多個(gè)線程各司其職,不

    2024年02月11日
    瀏覽(18)
  • Qt 中多線程的使用

    在進(jìn)行桌面應(yīng)用程序開發(fā)的時(shí)候, 假設(shè)應(yīng)用程序在某些情況下需要處理比較復(fù)雜的邏輯, 如果只有一個(gè)線程去處理,就會(huì)導(dǎo)致窗口卡頓,無法處理用戶的相關(guān)操作。這種情況下就需要使用多線程,其中一個(gè)線程處理窗口事件,其他線程進(jìn)行邏輯運(yùn)算,多個(gè)線程各司其職,不

    2024年02月03日
    瀏覽(29)
  • C#中多線程Task詳解

    C#中多線程Task詳解

    參考文章: 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 1.1Thread方式 缺點(diǎn):頻繁的創(chuàng)建和消耗比較好資源;提供操作線程的API不是馬上響應(yīng)(線程是

    2024年02月04日
    瀏覽(22)
  • C# 中多線程鎖的使用經(jīng)驗(yàn)

    C# 中多線程鎖的使用經(jīng)驗(yàn):全局鎖,實(shí)例鎖 ????????private static object _exeLock = new object(); ? ? ? ?static 靜態(tài)的是全應(yīng)用程序的資源。如果在一個(gè)類里定義了這樣一個(gè)鎖,你在調(diào)用使用這個(gè)類的時(shí)候,是NEW了一個(gè)對(duì)象,并把這個(gè)對(duì)象給了一個(gè)靜態(tài)全局變量中保存。這時(shí)這個(gè)鎖

    2024年03月14日
    瀏覽(28)
  • 【多線程系列-03】深入理解java中線程的生命周期,任務(wù)調(diào)度

    【多線程系列-03】深入理解java中線程的生命周期,任務(wù)調(diào)度

    多線程系列整體欄目 內(nèi)容 鏈接地址 【一】深入理解進(jìn)程、線程和CPU之間的關(guān)系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java創(chuàng)建線程的方式到底有幾種?(詳解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中線程的生命周期,任務(wù)調(diào)度 ht

    2024年02月17日
    瀏覽(28)
  • 《Linux從練氣到飛升》No.25 Linux中多線程概念

    ??作者: 主頁(yè) 我的專欄 C語言從0到1 探秘C++ 數(shù)據(jù)結(jié)構(gòu)從0到1 探秘Linux 菜鳥刷題集 ??歡迎關(guān)注:??點(diǎn)贊??收藏??留言 ?? 碼字不易,你的??點(diǎn)贊??收藏??關(guān)注對(duì)我真的很重要,有問題可在評(píng)論區(qū)提出,感謝閱讀!??!

    2024年02月06日
    瀏覽(15)
  • chrome插件開發(fā)實(shí)例03-使用 chrome.storage API永久保存數(shù)據(jù)

    目錄 防止數(shù)據(jù)丟失 使用chrome.storage API 功能 功能演示 源代碼 manifest.json

    2024年02月14日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包