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

詳解在Java中如何創(chuàng)建多線程程序

 更新時間:2021年06月18日 15:25:04   作者:歌者莫姓胡  
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著在Java中如何創(chuàng)建多線程程序展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下

創(chuàng)建多線程程序的第一種方式:創(chuàng)建Thread類的子類

java.lang.Thread類:是描述線程的類,我們想要實現(xiàn)多線程程序,就必須繼承Thread類

實現(xiàn)步驟:
1.創(chuàng)建一個Thread類的子類
2.在Thread類的子類中重寫Thread類中的run方法,設(shè)置線程任務(wù)(開啟線程要做什么?)
3.創(chuàng)建Thread類的子類對象
4.調(diào)用Thread類中的方法start方法,開啟新的線程,執(zhí)行run方法

void start()使該線程開始執(zhí)行;Java虛擬機調(diào)用該線程的run方法。

結(jié)果是兩個線程并發(fā)地運行﹔當前線程〈main線程〉和另一個線程〈創(chuàng)建的新線程,執(zhí)行其run方法)。
多次啟動一個線程是非法的(只能調(diào)用一次start方法)。特別是當線程已經(jīng)結(jié)束執(zhí)行后,不能再重新啟動。

java程序?qū)儆趽屨际秸{(diào)度,那個線程的優(yōu)先級高,那個線程優(yōu)先執(zhí)行;同一個優(yōu)先級,隨機選擇一個執(zhí)行

public class threadex extends Thread{
    public void run(){
        for (int i = 0; i < 20; i++) {
            System.out.println("run"+i);
        }
    }
 
}
public class thread {
    public static void main(String[] args) {
        threadex mt=new threadex();
        mt.start();
        for (int i = 0 ; i < 20; i++) {
            System.out.println("main"+i);
        }
    }
 
}

最終結(jié)果是隨機的:

多線程隨機性原理:

創(chuàng)建多線程程序的第二種方式:實現(xiàn)RunnabLe接口

java.Lang.Runnable
Runnable接口應(yīng)該由那些打算通過某一線程執(zhí)行其實例的類來實現(xiàn)。類必須定義一個稱為run的無參數(shù)方法。
java.Lang.Thread類的構(gòu)造方法
Thread ( Runnable target)分配新的 Thread 對象。
Thread ( Runnable target, string name)分配新的Thread 對象。

實現(xiàn)步驟:
1.創(chuàng)建一個Runnable接口的實現(xiàn)類
2.在實現(xiàn)類中重寫Runnable接口的run方法,設(shè)置線程任務(wù)
3.創(chuàng)建一個Runnable接口的實現(xiàn)類對象
4.創(chuàng)建Thread類對象,構(gòu)造方法中傳遞Runnable接口的實現(xiàn)類對象
5.調(diào)用Thread類中的start方法,開啟新的線程執(zhí)行run方法

public class threadex2 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}
public class thread {
    public static void main(String[] args) {
        //第二種
        threadex2 mt1=new threadex2();
        Thread t=new Thread(mt1);
        t.start();
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
 
}

結(jié)果同樣是隨機的:

實現(xiàn)Runnable接口創(chuàng)建多線程程序的好處:
1.避免了單繼承的局限性
一個類只能繼承一個類(一個人只能有一個親爹),類繼承了Thread類就不能繼承其他的類實現(xiàn)了Runnable接口,還可以繼承其他的類,實現(xiàn)其他的接口

2.增強了程序的擴展性,降低了程序的耦合性(解耦)
實現(xiàn)Runnable接口的方式,把設(shè)置線程任務(wù)和開啟新線程進行了分離(解耦)實現(xiàn)類中,重寫了run方法:用來設(shè)置線程任務(wù)
創(chuàng)建Thread類對象,調(diào)用start方法:用來開啟新線程

匿名內(nèi)部類方式實現(xiàn)線程的創(chuàng)建

匿名:沒有名字
內(nèi)部類:寫在其他類內(nèi)部的類
匿名內(nèi)部類作用:簡化代碼
把子類繼承父類,重寫父類的方法,創(chuàng)建子類對象合一步完成
把實現(xiàn)類實現(xiàn)接口,重寫接口中的方法,創(chuàng)建實現(xiàn)類對象合成一步完成
匿名內(nèi)部類的最終產(chǎn)物:子類/實現(xiàn)類對象,而這個類沒有名字
格式:
new  父類/接口 () {
      重復父類/接口中的方法
};

public static void main(String[] args) {
        new Thread(){
            public void run(){
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName()+"cs"+i);
                }
            }
        }.start();//Thread-0
 
        //線程的接口Runnable
        //Runnable r=new RunnableImpl();//多態(tài)
        Runnable r=new Runnable(){
            //重寫run方法,設(shè)置線程任務(wù)
            public void run(){
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName()+"ff"+i);
                }
            }
        };
        new Thread(r).start();
 
        //簡化
        new Thread(new Runnable(){
            //重寫run方法,設(shè)置線程任務(wù)
            public void run(){
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName()+"hj"+i);
                }
            }
        }).start();
    }

Thread類中的常用方法:

獲取線程的名稱:
1.使用Thread類中的方法getName()
String getName()  返回該線程的名稱。

2.可以先獲取到當前正在執(zhí)行的線程,使用線程中的方法getName()獲取線程的名稱
static Thread currentThread()返回對當前正在執(zhí)行的線程對象的引用。

方法一

//方法一
public class threadfun extends Thread{
    public void run(){
        String name = getName();
        System.out.println(name);
    }
}
/*
線程的名稱:
主線程: main
新線程:Thread-0, Thread-1 , Thread-2
 */
public class threadfunmain {
    public static void main(String[] args) {
        threadfun mt = new threadfun();
        mt.start();//Thread-0
        new threadfun().start();//Thread-1
        new threadfun().start();//Thread-2
    }
}

方法二

public class threadfun extends Thread{
    public void run(){
        //方法二
        Thread th = Thread.currentThread();
        System.out.println(th);
        String name = getName();
        System.out.println(name);
        //System.out.println(Thread.currentThread().getName());
    }
}
public class threadfunmain {
    public static void main(String[] args) {
        threadfun mt = new threadfun();
        mt.start();//Thread[Thread-0,5,main] Thread-0
        new threadfun().start();//Thread[Thread-1,5,main] Thread-1
        new threadfun().start();//Thread[Thread-2,5,main] Thread-2
        System.out.println(Thread.currentThread().getName());//main
        //主線程中只能用第二種方法獲取,因為測試類沒有繼承Thread類,沒有g(shù)etname方法
    }
}

設(shè)置線程的名稱:(了解)
1.使用Thread類中的方法setName(名字)
void setName ( String name)改變線程名稱,使之與參數(shù)name相同。

2.創(chuàng)建一個帶參數(shù)的構(gòu)造方法,參數(shù)傳遞線程的名稱;調(diào)用父類的帶參構(gòu)造方法,把線程名稱傳遞給父類,讓父類(Thread)給子線程起一個名字
Thread ( String name)分配新的Thread 對象。

public class threadfun extends Thread{
    public void run(){
        //設(shè)置線程的名稱方法一
        System.out.println(Thread.currentThread().getName());
    }
    //設(shè)置線程的名稱方法二
    threadfun(){}
    threadfun(String name){
        super(name);
    }
}
public class threadfunmain {
    public static void main(String[] args) {
        threadfun mt = new threadfun(); 
        //設(shè)置線程的名稱方法一
        mt.setName("ess");
        mt.start();
 
        //設(shè)置線程的名稱方法二
        new threadfun("ff").start();
 
    }
}

public static void sleep(Long millis):使當前正在執(zhí)行的線程以指定的毫秒數(shù)暫停(暫時停止執(zhí)行)。毫秒數(shù)結(jié)束之后,線程繼續(xù)執(zhí)行

//sleep
        for (int i = 0; i < 20; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

到此這篇關(guān)于詳解在Java中如何創(chuàng)建多線程程序的文章就介紹到這了,更多相關(guān)Java創(chuàng)建多線程程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis-Plus框架整合詳細方法

    MyBatis-Plus框架整合詳細方法

    MyBatis-Plus是一個 MyBatis 的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生這篇文章主要介紹了MyBatis-Plus框架整合,需要的朋友可以參考下
    2022-04-04
  • Java設(shè)計模式之工廠模式案例詳解

    Java設(shè)計模式之工廠模式案例詳解

    工廠模式(Factory Pattern)是Java中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。本文將通過案例詳細講解一下工廠模式,需要的可以參考一下
    2022-02-02
  • 在js與java中判斷json數(shù)據(jù)中是否含有某字段的案例

    在js與java中判斷json數(shù)據(jù)中是否含有某字段的案例

    這篇文章主要介紹了在js與java中判斷json數(shù)據(jù)中是否含有某字段的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • SpringBoot?自定義注解之脫敏注解詳解

    SpringBoot?自定義注解之脫敏注解詳解

    這篇文章主要介紹了SpringBoot?自定義注解之脫敏注解詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Boot 功能整合的實現(xiàn)

    Spring Boot 功能整合的實現(xiàn)

    Spring Boot生態(tài)豐富,集成也不算困難。本文簡單的介紹下功能整合的步驟,最后提供一個具體的實現(xiàn)例子,學習Spring Boot的同學可以參考下
    2021-05-05
  • JVM內(nèi)存結(jié)構(gòu):程序計數(shù)器、虛擬機棧、本地方法棧

    JVM內(nèi)存結(jié)構(gòu):程序計數(shù)器、虛擬機棧、本地方法棧

    JVM 基本上是每家招聘公司都會問到的問題,它們會這么無聊問這些不切實際的問題嗎?很顯然不是。由 JVM 引發(fā)的故障問題,無論在我們開發(fā)過程中還是生產(chǎn)環(huán)境下都是非常常見的
    2021-06-06
  • 詳解Jackson的基本用法

    詳解Jackson的基本用法

    Java生態(tài)圈中有很多處理JSON和XML格式化的類庫,Jackson是其中比較著名的一個。雖然JDK自帶了XML處理類庫,但是相對來說比較低級,使用本文介紹的Jackson等高級類庫處理起來會方便很多
    2021-06-06
  • Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實現(xiàn)多環(huán)境打包

    Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實現(xiàn)多環(huán)境打包

    這篇文章主要介紹了Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實現(xiàn)多環(huán)境打包的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • 詳解Java的JDBC中Statement與PreparedStatement對象

    詳解Java的JDBC中Statement與PreparedStatement對象

    這篇文章主要介紹了詳解Java的JDBC中Statement與PreparedStatement對象,PreparedStatement一般來說比使用Statement效率更高,需要的朋友可以參考下
    2015-12-12
  • Mybatis Update操作返回值問題

    Mybatis Update操作返回值問題

    在獲取update操作的返回值時遇到了一個問題,似乎 Mybatis 進行 update 操作得到的 int 返回值并不是影響的行數(shù),下面通過本文給大家分享Mybatis Update操作返回值問題,需要的朋友參考下吧
    2017-09-09

最新評論

巫山县| 阜新市| 辽源市| 临澧县| 年辖:市辖区| 德庆县| 霸州市| 兴和县| 渭源县| 榆林市| 庆云县| 阳信县| 皋兰县| 炉霍县| 鄂伦春自治旗| 佛山市| 若羌县| 江安县| 土默特左旗| 云林县| 天门市| 县级市| 南涧| 武义县| 安阳市| 盐津县| 津南区| 安陆市| 方城县| 重庆市| 荔波县| 湛江市| 郓城县| 舒城县| 获嘉县| 昌邑市| 磐安县| 庆云县| 武强县| 佛教| 礼泉县|